Olá pessoal,
Tenho um filtro de cookies que verifica o cookie no browser de acordo com o código (id gravado no cookie). Se o código bate, ele carrega o usuario do sistema atraves do id.
Após isso, ele coloca esse usuário na sessão, fazendo com que o usuário seja logado automaticamente.
Até aí tranquilo, mas acontece que quando eu faço o login no sistema, eu fecho o browser, porém quando eu abro o browser novamente, ao chamar a url do sistema, ele (deveria logar automaticamente) não loga no primeiro request. Só quando eu faço mais um request (digito a url de novo) ele faz o login automático.
O problema aí é o seguinte: o filtro é chamado no primeiro request, joga o usuário na sessão, mas a lógica (request) chamada recebe o usuário nulo. Só após o primeiro request que a sessão é estabelecida na lógica com o usuário.
Minha aplicação utiliza VRaptor . Vou postar o código pra esclarecer melhor:
Filtro CookieFilter();
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
if (response instanceof HttpServletResponse && request instanceof HttpServletRequest) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
Cookie cookies[] = httpRequest.getCookies();
if (cookies != null) {
Cookie cookieLogin = null;
for (Cookie c : cookies) {
if (c.getName().equals("lembrarDeMim") && c.getValue() != null && c.getValue().length() > 0) {
c.setMaxAge(7 * 24 * 60 * 60);
//c.setDomain("localhost");
c.setPath("/");
c.setVersion(1);
cookieLogin = c;
httpResponse.addCookie(c);
}
}
if (cookieLogin != null) {
HttpSession session = httpRequest.getSession(false);
//HttpSession session = httpRequest.getSession();
if (session != null) {
System.out.println("Id sessao: " + session.getId());
Usuario usuarioLogado = (Usuario) session.getAttribute("usuario");
if (usuarioLogado == null) {
String valor = cookieLogin.getValue();
if (valor != null && valor.length() > 0) {
String split[] = valor.split(";");
if (split.length > 2) {
String sid = split[0];
String login = split[1];
System.out.println("\nLogin: " + login);
String codigo = split[2];
String codigoCerto = new CodificadorDeEmails().codificar(login);
if (codigo.equals(codigoCerto)) {
Long id = Long.parseLong(sid);
System.out.println("\nId usuario: " + id);
RepositorioFactoryInterface factory = new DaoFactory();
factory.beginTransaction();
usuarioLogado = factory.getUsuarioRepositorio().getPeloId(id);
System.out.println("\nNome usuario: " + usuarioLogado.getPerfil().getNome());
session.setAttribute("usuario", usuarioLogado);
//httpResponse.sendRedirect(httpRequest.getRequestURI());
usuarioLogado.setUltimoLogin(new Date());
factory.commit();
factory.close();
return;
}
}
}
}
}
}
}
}
try {
chain.doFilter(request, response);
} catch (Throwable t) {
Logger.getLogger(CookieFilter.class.getName()).log(Level.SEVERE, "Nao foi possivel filtrar cookies", t);
}
}
Web.XML:
<filter>
<filter-name>CookieFilter</filter-name>
<filter-class>br.com.bla.filtros.CookieFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CookieFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Alguém sabe se o VRaptor cria uma sessão quando se executa o filtro?
Desculpem se ainda não ficou claro.
Grato pela atenção