Alguém já conseguiu manter uma única session por login? ex: não permitir o mesmo usuário logar em outro navegador/desktop.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Alguém já conseguiu manter uma única session por login? ex: não permitir o mesmo usuário logar em outro navegador/desktop.
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);
}