2
respostas

sessão única com HttpSession e doFilter

Alguém já conseguiu manter uma única session por login? ex: não permitir o mesmo usuário logar em outro navegador/desktop.

2 respostas

Boa tarde, Aline! Como vai?

A própria Alura pelo que já percebi implementa esse tipo de funcionalidade. O que vc pode fazer é o seguinte:

Quando o usuário fizer o login, faça o cadastro na sessão utilizando uma chave como por exemplo o email do usuário que está se autenticando. E crie um token que deverá ser trocado entre o cliente e o servidor a cada requisição. Dessa forma, quando vc tentar fazer login em outro computador/navegador, esse token não será enviado. Então vc mata a sessão que já existia, cria uma nova e tbm cria um novo token.

Isso fará com que a primeira sessão deixe de existir e na requisição seguinte, como o token estará inválido, terá que ser feito um novo login.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos!

ham tentei setar o id do usuário com o hash da session pra no filter comparar sessionFilter x sessionUsuario mas nao deu muito certo... =/

@WebServlet(urlPatterns = "/login")
public class Login extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        PrintWriter writer = resp.getWriter();

        String email = req.getParameter("email");
        String senha = req.getParameter("senha");

        Usuario usuario = new UsuarioDAO().buscaPorEmailESenha(email, senha);

        if(usuario == null) {
            writer.println("<html><body>Usuário ou senha inválida.</body></html>");
        }else {

    HttpSession session = req.getSession();
            session.setAttribute("usuarioLogado", usuario);//map
            session.setAttribute("sessionUsuario", session);//map

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

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

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

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;




        HttpSession session = req.getSession();    
        HttpSession sessionUsuario = (HttpSession) session.getAttribute("sessionUsuario");
        Usuario usuarioLogado = (Usuario) session.getAttribute("usuarioLogado");

        String usuario = "<deslogado>";
        String url = req.getRequestURL().toString();

        if(url.contains("login")) {//silveira userLogado != null ||
            System.out.println("Usuario Logado acessando a uri " 
                    + req.getRequestURI());

            chain.doFilter(req, response);
        }if(sessionUsuario != null) {
            System.out.println("usuario LOGADO ");
            usuarioLogado.setId(sessionUsuario.getId());
            chain.doFilter(req, response);

            if(session.isNew() && session.getId() != usuarioLogado.getId() ) {
                System.out.println("sessao nova e já existe um usuario logado");
            }    
        }
else {

            System.out.println("Usuario DESLOGADO " + usuario + " acessando a uri " 
                    + req.getRequestURI());

            req.getRequestDispatcher("/index.jsp").forward(req, response);
            }