Filtro de Cookies

1 resposta
leandronsp

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

1 Resposta

leandronsp

Alguém já passou ou sabe como resolver este problema?

Grato.

Criado 15 de junho de 2009
Ultima resposta 17 de jun. de 2009
Respostas 1
Participantes 1