Estou parado há alguns dias em um ponto que não consigo resolver. Estou fazendo um site utilizando Java Servlet no Tomcat e com Spring MVC. Quando o usuário loga eu gravo seu registro tanto na session quanto nos cookies pois quero evitar ao máximo que o usuário tenha que ficar logando. Assim mesmo que o servidor seja reiniciado e o usuário perca a session, eu poderia reconhece-lo pelo cookie,
O problema é que criei um controller para o usuário fazer logout, apagando os cookies e terminando a session porém os cookies não estão sendo alterados. Para mostrar isso fiz o seguinte: Executo o controller do logout que termina a session e apaga os cookies, neste mesmo controller escrevo no console as informações dos cookies ao final para garantir que foram alterados. Esse controller envia o usuário a um outro contoller que checa os cookies novamente e imprime no console do servidor, porém neste momento os cookies reaparecem da mesma forma que estavam antes de passar pelo logout.
Abaixo estão os códigos do controller logout, e do controller que checa os cookies assim como as respostas que imprimem no console.
Código do Controller de logout
@RequestMapping("private/logout")
private String logout(HttpServletRequest request, HttpServletResponse response) {
request.getSession().invalidate();
System.out.println("Sessao invalidada");
Cookie[] cookies = null;
cookies = request.getCookies();
if (cookies != null) {
Cookie usuario = null;
Cookie usuarioAtivo = null;
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("usuario")) usuario = cookies[i];
if (cookies[i].getName().equals("usuarioAtivo")) usuarioAtivo = cookies[i];
}
if (usuario != null) {
usuario.setValue("");
usuario.setMaxAge(0);
response.addCookie(usuario);
System.out.println(" -- Passou pela exclusao do cookies usuario");
}
if (usuarioAtivo != null) {
usuarioAtivo.setValue("");
usuarioAtivo.setMaxAge(0);
response.addCookie(usuarioAtivo);
System.out.println(" -- Passou pela exclusao do cookies usuarioAtivo");
}
for (int i = 0; i < cookies.length; i++) {
System.out.println(
"###### COOKIE \n " +
"## Cookie: " + cookies[i].getName() + "\n" +
"## Valor: " + cookies[i].getValue() + "\n" +
"## Path: " + cookies[i].getPath() + "\n" +
"## Domain " + cookies[i].getDomain() + "\n" +
"## MaxAge " + cookies[i].getMaxAge() + "\n\n");
}
System.out.println("Cookie de usuario desativado");
}
return "redirect:../checkCookies";
}
O que é impresso no servidor após rodar o logout:
Sessao invalidada
-- Passou pela exclusao do cookies usuario
-- Passou pela exclusao do cookies usuarioAtivo
###### COOKIE
## Cookie: JSESSIONID
## Valor: 07E1E015B8E3FBE74388753BF08FCEDA
## Path: null
## Domain null
## MaxAge -1
###### COOKIE
## Cookie: usuario
## Valor:
## Path: null
## Domain null
## MaxAge 0
###### COOKIE
## Cookie: usuarioAtivo
## Valor:
## Path: null
## Domain null
## MaxAge 0
Cookie de usuario desativado
Código do controller que checa os cookies:
@RequestMapping("checkCookies")
private String checkCookies(HttpServletRequest request, HttpServletResponse response) {
System.out.println("Iniciando check cookies");
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
System.out.println(
"###### COOKIE \n " +
"## Cookie: " + cookies[i].getName() + "\n" +
"## Valor: " + cookies[i].getValue() + "\n" +
"## Path: " + cookies[i].getPath() + "\n" +
"## Domain " + cookies[i].getDomain() + "\n" +
"## MaxAge " + cookies[i].getMaxAge() + "\n\n");
}
return "abc";
}
O que foi impresso após rodar o controller de cehcagem dos cookies:
Iniciando check cookies
###### COOKIE
## Cookie: JSESSIONID
## Valor: 07E1E015B8E3FBE74388753BF08FCEDA
## Path: null
## Domain null
## MaxAge -1
###### COOKIE
## Cookie: usuario
## Valor: teste
## Path: null
## Domain null
## MaxAge -1
###### COOKIE
## Cookie: usuarioAtivo
## Valor: sim
## Path: null
## Domain null
## MaxAge -1
Resumindo, os cookies estão exatamente iguais ao que estavam antes de rodar o logout.
Alguém consegue ajudar?