Falha de Segurança | Autenticação Java Web

Olá pessoal,

Estou construindo um CRUD em Java Web para estudar e adquirir conhecimento.

Não estou usando nenhum Framework, somente JSTL para ter um código mais elegante nas JSPs.

Eu implementei recentemente a autenticação do sistema usando Filter e HttpSession.
E implementei também o botão ‘sair’ que chama uma ação no meu sistema que invalida a sessão session.invalidate(); e depois redireciona para a página de login.

Porém, mesmo invalidando a sessão e barrando as requisições com Filtros, se eu clicar em ‘Voltar’ no navegador, eu acesso o meu sistema na última página que eu acessei antes de ‘sair’.

Eu não consigo fazer nada lá dentro. Qualquer ação é barrada pelo meu Filtro. Porém, eu gostaria que ao tentar voltar a página, o navegador redirecionasse sempre para a página de login.

Já tentei muita coisa, e nada resolveu. Por isso estou achando que pode ser algo no Tomcat, estou usando a versão 9.

Resumindo: Quando eu saio do sistema e redireciono para a página de login, não quero que seja possível ‘voltar’ no navegador e acessar o sistema novamente, mesmo que eu não consiga fazer nada lá dentro.

Alguém já passou por isso? Poderiam dar uma sugestão?

Ao deslogar, como vc está retornando para a página de login? Com um forward ou com um redirect?

Ao deslogar, altere o response assim:

response.setHeader("Cache-Control","no-cache"); 
response.setHeader("Cache-Control","no-store"); 
response.setDateHeader("Expires", 0); 

e faça um redirect (sendRedirect) para a página de login.

1 curtida

Eu faço assim:
Ao clicar em sair eu passo pela Servlet que verifica qual é a ação.

A ação é Logout, então eu chamo o método executa() que envia um resp.sendRedirect("reserva?action=LoginForm");

Esse redirect chama a ação LoginForm que por sua vez executa um forward para a página login.jsp.

Coloquei o código que me passou, lá minha ação Logout onde eu invalido a sessão.

To achando que vou precisar tirar o login.jsp de dentro da WEB-INF para poder usar o sendRedirect(“login.jsp”) direto para login.jsp sem chamar nenhuma outra ação que use forward.

No trecho de código onde vc está invalidando a sessão, vc pode chamar o sendRedirect do response:

HttpServletResponse.sendRedirect(String)

1 curtida

Desculpa incomodar com isso novamente.

Eu tirei o login.jsp de dentro do WEB-INF e agora consegui usar o resp.sendRedirect("login.jsp")

Fiz como sugerido, coloquei no bloco de código do Logout:
session.invalidate();
resp.setHeader(“Cache-Control”,“no-cache”);
resp.setHeader(“Cache-Control”,“no-store”);
resp.setDateHeader(“Expires”, 0);
resp.sendRedrect(“login.jsp”);

Ele redireciona para a login.jsp mas permaneceu problema de voltar para dentro do sistema.

Testei utilizando o Jetty ao invés do Tomcat, e o problema permaneceu.
Então é algo que preciso resolver no código mesmo.

Lucas,

Funcionou com esse código. Porém, em outra parte do sistema.
Coloquei na parte onde eu dou forward para as páginas dentro do sistema.
Não faço ideia do porquê rs

Mas resolveu!

Coloquei meu código no GitHub se alguém quiser dar uma olhada.
Essa parte ficou na classe ControllerFilter

1 curtida