2009-05-21 36 views
117

¿Cómo se elimina una cookie en un servlet de Java?¿Cómo se elimina una cookie en un servlet Java?

yo probamos este: http://www.jguru.com/faq/view.jsp?EID=42225

EDIT: La siguiente ahora funciona con éxito parece ser la combinación de:

response.setContentType("text/html"); 

y

cookie.setMaxAge(0); 

Antes de que yo estaba haciendo:

//remove single signon cookie if it hasn't been validated yet 
response.setContentType("text/html"); 
Cookie cookie = new Cookie(SSORealm.SSO_COOKIE_NAME, ""); 
cookie.setDomain(SSORealm.SSO_DOMAIN); 
cookie.setMaxAge(-1); 
cookie.setPath("/"); 
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis()); 
response.addCookie(cookie); 

que caduca la cookie cuando el navegador está cerrado según the documentation.

Un valor negativo significa que la cookie no se almacena persistentemente y se eliminará cuando el navegador web salga. Un valor cero hace que la cookie sea eliminada.

El fragmento completo de trabajo para expirar una cookie es:

//remove single signon cookie if it hasn't been validated yet 
response.setContentType("text/html"); 
Cookie cookie = new Cookie(SSORealm.SSO_COOKIE_NAME, ""); 
cookie.setDomain(SSORealm.SSO_DOMAIN); 
cookie.setMaxAge(0); 
cookie.setPath("/"); 
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis()); 
response.addCookie(cookie); 

Respuesta

117

MaxAge de -1 indica que desea que la cookie persista durante la sesión. Desea establecer MaxAge en 0 en su lugar.

Desde el API documentation:

Un valor negativo significa que la cookie no se almacena persistentemente y se eliminará cuando el navegador Web sale. Un valor cero hace que la cookie sea eliminada.
+8

Intenté setMaxAge (0) inicialmente en firefox, pero aún así lo vi en mis cookies como "Caduca: al final de la sesión" y pensé que mi servlet todavía estaba recibiendo esa cookie vencida. Podría haber sido un combo de la necesidad de establecer el response.setContentType ("text/html"); y setMaxAge (0); que finalmente lo hizo funcionar. Lo intenté de nuevo y parece que la cookie con setMaxAge (0) no se enviará en solicitudes posteriores a mis servlets de Java. – Dougnukem

+0

Respuesta clara y útil, gracias. –

11

Tenga en cuenta que una cookie es en realidad definida por la tupla de ella de nombre, ruta, y el dominio. Si alguno de esos tres es diferente, o si hay más de una cookie del mismo nombre, pero está definida con rutas/dominios que aún pueden estar visibles para la URL en cuestión, igual verá la cookie pasada en la solicitud. P.ej. si la url es "http://foo.bar.com/baz/index.html", verá cualquier cookie definida en bar.com o foo.bar.com, o con una ruta de "/" o "/ baz".

Por lo tanto, parece que debería funcionar, siempre que solo haya una cookie definida en el cliente, con el nombre "SSO_COOKIE_NAME", el dominio "SSO_DOMAIN" y la ruta "/". Si hay cookies con una ruta o dominio diferente, igual verá la cookie enviada al cliente.

Para solucionar este problema, vaya a las preferencias de Firefox -> pestaña Seguridad, y busque todas las cookies con SSO_COOKIE_NAME. Haga clic en cada uno para ver el dominio y la ruta. Apuesto a que encontrarás uno allí que no es exactamente lo que estás esperando.

+0

Aunque también podría ser que el nombre o la ruta no es la de la cookie que está viendo en el navegador (una vez que se fija el valor MaxAge), la presencia o ausencia de otras cookies no tiene nada que ver con el estado, presencia o ausencia de la cookie particular que está configurando. –

6

Este es un código que he usado de manera efectiva antes, pasando "/" como el parámetro strPath.

public static Cookie eraseCookie(String strCookieName, String strPath) { 
    Cookie cookie = new Cookie(strCookieName, ""); 
    cookie.setMaxAge(0); 
    cookie.setPath(strPath); 

    return cookie; 
} 
6
Cookie[] cookies = request.getCookies(); 
if(cookies!=null) 
for (int i = 0; i < cookies.length; i++) { 
cookies[i].setMaxAge(0); 
} 

fue eso no funcionó? Esto elimina todas las cookies si la respuesta se envía de vuelta.

+11

No olvides volver a agregar la cookie modificada a la respuesta con response.addCookie (cookies [i]); –

50

En mi entorno, el siguiente código funciona. Aunque parece redundante a primera vista, es necesario cookies[i].setValue(""); y cookies[i].setPath("/"); para borrar la cookie correctamente.

private void eraseCookie(HttpServletRequest req, HttpServletResponse resp) { 
    Cookie[] cookies = req.getCookies(); 
    if (cookies != null) 
     for (Cookie cookie : cookies) { 
      cookie.setValue(""); 
      cookie.setPath("/"); 
      cookie.setMaxAge(0); 
      resp.addCookie(cookie); 
     } 
} 
+1

Parece que funciona de manera uniforme en todos los navegadores. –

+0

No estoy seguro de que deba establecer el valor o la ruta de la cookie porque podría verse como una cookie diferente, ¿no? Para borrar una cookie, solo debe establecer que max-age sea 0. – Gray

Cuestiones relacionadas