Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro em identificar o usuário logado

Na minha implementação da Session utilizei o Tomcat 8.5.4, e rodando no Mozilla Firefox, não sei se isso tem algo a ver, e havia encerrado o servidor no Eclipe (Neon) e fechado o navegador, mas o log não imprimia corretamente quando eu fiquei logado exibindo a sequencia:

Usuário <deslogado> acessando a URI: /gerenciador/
Usuário <deslogado> acessando a URI: /gerenciador/loginSession
Usuário <deslogado> acessando a URI: /gerenciador/
Usuário <deslogado> acessando a URI: /gerenciador/
Usuário <deslogado> acessando a URI: /gerenciador/busca
Usuário <deslogado> acessando a URI: /gerenciador/logoutSession
Usuário <deslogado> acessando a URI: /gerenciador/loginSession
Usuário guilherme@alura.com.br acessando a URI: /gerenciador/loginSession
Usuário guilherme@alura.com.br acessando a URI: /gerenciador/busca
Usuário guilherme@alura.com.br acessando a URI: /gerenciador/
Usuário guilherme@alura.com.br acessando a URI: /gerenciador/logoutSession
Usuário <deslogado> acessando a URI: /gerenciador/

Ou seja ao acessar o gerenciador o usuário estava deslogado. Efetuei o login e ele continuou apresentando deslogado, fiz vários acessos e ainda persistia sem me identificar como logado. Desloguei e loguei novamente e só a partir do segundo login foi que ele passou a reconhecer. Outra coisa que observei é que ele mantém em cache a pagina, por exemplo após efetuar o login e digitar o endereço localhost:8080/gerenciador. Só quando forço a atualização do browse (Ctrl + F5) é que ele atualiza meu log, ou seja, só aí ele reconhece que esta logado? Segui a implementação dos métodos iguais as do vídeo.

4 respostas

Por favor mande a classe modelo que você está subindo para o escopo de sessão

Login

@WebServlet(urlPatterns = "/loginSession")
public class LoginSession extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException  {
    String email = req.getParameter("email");
    String senha = req.getParameter("senha");
    Usuario usuario = new UsuarioDAO().buscaPorEmailESenha(email, senha);
    PrintWriter writer = resp.getWriter();
    if (usuario == null) {
        writer.println("<html><body>Usuário ou senha inválida</body></html>");
    } else {
        HttpSession session = req.getSession();
        session.setAttribute("usuario.logado", usuario);
        writer.println("<html><body>Usuário logado: " + email + "</body></html>");
    }
    }

}

Filtro

@WebFilter(urlPatterns = "/*")
public class FiltroDeAuditoriaSession implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    String uri = req.getRequestURI();
    String usuario = getUsuario(req);

    System.out.println("Usuário " + usuario + " acessando a URI: " + uri);
    chain.doFilter(request, response);
    }

    private String getUsuario(HttpServletRequest req) {
    Usuario usuario = (Usuario) req.getSession().getAttribute("usuario.logado");
    if(usuario==null) return "<deslogado>";
    return usuario.getEmail();
    }
    ...

E Logout

@WebServlet(urlPatterns = "/logoutSession")
public class LogoutSession extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getSession().removeAttribute("usuario.logado");    
    PrintWriter writer = resp.getWriter();
    writer.println("<html><body>LogoutSession efetuado</body></html>");
    }
}
solução!

Tenta assim :

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String senha=request.getParameter("senha");
        String email= request.getParameter("email");
        PrintWriter writer = response.getWriter();
        Usuario u = new UsuarioDAO().buscaPorEmailESenha(email, senha);
        if(u==null){
            writer.print("<html><body>USUARIO INCORRETO</body></html>");
        }else{
            request.getSession().setAttribute("usuarioLogado", u);
            writer.println("<html><body>Usuário logado: " + email
                        + "</body></html>");
        }


    }
private String getUsuario(HttpServletRequest req) {
        Usuario usuario =(Usuario)req.getSession().getAttribute("usuarioLogado");
        if(usuario!=null){
            return usuario.getEmail();
        }
        return "<DESLOGADO>";
    }

Blz João Eduado. Só acrescentei um cast para HttpServletResponse para a response ServletResponse

HttpServletResponse resp = (HttpServletResponse) response;

Normalizando após isso, pois ainda persistia em não reconhcer. Mas era nessa logica. Mas no caso vc só encadeou as chamadas? Era apenas isso?