2012-03-22 10 views
21

Me gustaría saber cómo eliminar una cookie en un HttpServletResponse en Spring MVC. Tengo el método de inicio de sesión donde creo la cookie y el cierre de sesión donde quiero eliminarlo, pero no funciona.Eliminar cookie de una respuesta servlet

Aquí está el código:

@RequestMapping(method = RequestMethod.POST) 
public ModelAndView Login(HttpServletResponse response, String user, String pass) {  
    if (user != null && pass != null && userMapper.Users.get(user).getPass().equals(pass)){ 
     Cookie cookie = new Cookie("user", user); 
     cookie.setPath("/MyApplication"); 
     cookie.setHttpOnly(true); 
     cookie.setMaxAge(3600); 
     response.addCookie(cookie); 
     Map model = new HashMap(); 
     model.put("user", user); 
     return new ModelAndView("home", "model", model); 
    } 
    return new ModelAndView("login"); 
} 

@RequestMapping(value="/logout", method = RequestMethod.POST) 
public ModelAndView Logout(HttpServletRequest request, HttpServletResponse response) {  

     Cookie[] cookies = request.getCookies(); 
     for(int i = 0; i< cookies.length ; ++i){ 
      if(cookies[i].getName().equals("user")){ 
       //Cookie cookie = new Cookie("user", cookies[i].getValue()); 
       //cookie.setMaxAge(0); 
       //response.addCookie(cookie); 
       cookies[i].setMaxAge(0); 
       response.addCookie(cookies[i]); 
       break; 
      } 
     } 
     return new ModelAndView("login"); 
} 

pensé que sólo era necesario cambiar el maxAge, pero en el navegador la cookie no cambian. Incluso intenté reescribir una cookie con el mismo nombre en el bloque comentado, pero tampoco funciona.

+0

¿Has probado cookie.setvalue ("") ?? –

+0

posible duplicado de [Cómo se elimina una cookie en un servlet de Java] (http://stackoverflow.com/questions/890935/how-do-you-remove-a-cookie-in-a-java-servlet) – skaffman

+0

sí, el setValue ("") tampoco funcionó ... – Cruz

Respuesta

60

Estableciendo la edad máxima en 0 es correcto. Pero debe tener exactamente las mismas otras propiedades de cookies, excepto por el valor. Por lo tanto, exactamente el mismo dominio, ruta, seguro, etc. El valor es opcional, se puede establecer mejor en null.

Por lo tanto, dada la forma en cómo se creó la cookie,

Cookie cookie = new Cookie("user", user); 
cookie.setPath("/MyApplication"); 
cookie.setHttpOnly(true); 
cookie.setMaxAge(3600); 
response.addCookie(cookie); 

que debe ser eliminado de la siguiente manera:

Cookie cookie = new Cookie("user", null); // Not necessary, but saves bandwidth. 
cookie.setPath("/MyApplication"); 
cookie.setHttpOnly(true); 
cookie.setMaxAge(0); // Don't set to -1 or it will become a session cookie! 
response.addCookie(cookie); 

Dicho esto, no estoy seguro de cómo es útil para almacenar el usuario que inició sesión como una cookie. Básicamente, también estás permitiendo que el usuario final manipule su valor. En su lugar, simplemente guárdelo como un atributo de sesión y llame al session.invalidate() al cerrar la sesión.

+0

Gracias, eso es todo, bueno, voy a trabajar con este framework de ahora en adelante, y estoy aprendiendo cómo funciona, y estaba tratando de entender el uso de cookies aquí, es por eso que hice el inicio de sesión a través del usuario. – Cruz

+0

"No estoy seguro de cómo es útil almacenar el usuario conectado como una cookie". Quizás sea relevante si también está vinculado a un sistema de inicio de sesión único y necesita cerrar sesión permanentemente a través de su cookie depositada. – carlosayam

+0

El valor de ruta era el mismo. Configuré la cookie con la ruta "/ mywebapp" y luego intenté eliminarla con "/" ruta raíz. No funcionó, pero tuvo que usar los valores exactos cookie.setPath ("/ mywebapp"), cookie.setMaxAge (0), cookie.setValue (null), response.addCookie (cookie) – Whome

-1

No necesita utilizar su propio código. Simplemente configure el bean rememberMeServices que crearía la cookie mientras el usuario inicia sesión con la opción rememberMe activada, y la eliminaría después de finalizar la sesión.

Cuestiones relacionadas