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

135

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

Intenté esto: http://www.jguru.com/faq/view.jsp?EID=42225

EDITAR: Lo siguiente ahora funciona correctamente, parece ser la combinación de:

response.setContentType("text/html");

y

cookie.setMaxAge(0);

Antes de que estuviera 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 se cierra según la documentación .

Un valor negativo significa que la cookie no se almacena de forma persistente y se eliminará cuando se cierre el navegador web. Un valor cero hace que la cookie se elimine.

El fragmento de trabajo completo para caducar 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);
Dougnukem
fuente

Respuestas:

138

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

De la documentación de la API :

Un valor negativo significa que la cookie no se almacena de forma persistente y se eliminará cuando se cierre el navegador web. Un valor cero hace que la cookie se elimine.
cjs
fuente
9
Intenté setMaxAge (0) inicialmente en Firefox pero todavía lo vi en mis cookies como "Caduca: al final de la sesión" y pensé que mi servlet todavía estaba recibiendo esa cookie caducada. Podría haber sido una combinación de la necesidad de establecer el response.setContentType ("text / html"); y setMaxAge (0); eso hizo que finalmente funcionara. Lo intenté de nuevo y parece que la cookie con setMaxAge (0) no se enviará en solicitudes posteriores a mis servlets de Java.
Dougnukem
62

En mi entorno, el siguiente código funciona. Aunque parece redundante a primera vista, cookies[i].setValue("");y cookies[i].setPath("/");son necesarios 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);
        }
}
wu liang
fuente
1
Esto parece funcionar de manera consistente en todos los navegadores.
ug_
55
No estoy seguro de que deba establecer el valor o la ruta de la cookie porque eso podría verse como una cookie diferente, ¿verdad? Para borrar una cookie, solo debe establecer la edad máxima en 0.
Gris
2
cookie.setPath (...) debe coincidir con la ruta que se utilizó cuando se creó la cookie (lo mismo para el nombre y el dominio de la cookie).
markus
12

Tenga en cuenta que una cookie se define realmente por la tupla de su nombre, ruta y dominio. Si alguno de esos tres es diferente, o si hay más de una cookie con el mismo nombre, pero definida con rutas / dominios que aún pueden ser visibles para la URL en cuestión, aún así verá que la cookie pasó en la solicitud. Por ejemplo, si la url es " http://foo.bar.com/baz/index.html ", verá las cookies definidas en bar.com o foo.bar.com, o con una ruta de "/" o "/ baz".

Por lo tanto, lo que tiene parece 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, aún verá la cookie enviada al cliente.

Para depurar esto, 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 que no es exactamente lo que esperas.

broofa
fuente
Si bien también podría ser que el nombre o la ruta no es el de la cookie que está mirando en el navegador (una vez que fija el valor de MaxAge), la presencia o ausencia de otras cookies no tiene nada que ver con el estado, la presencia o ausencia de la cookie particular que está configurando.
cjs
8
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

¿eso no funcionó? Esto elimina todas las cookies si se devuelve la respuesta.

aholbreich
fuente
15
No olvide volver a agregar la cookie modificada a la respuesta con response.addCookie (cookies [i]);
Philihp Busby el
7

Este es un código que efectivamente he usado 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;
}
Kevin Hakanson
fuente
0

Un caso especial: una cookie no tiene ruta.

En este caso, establezca la ruta como cookie.setPath(request.getRequestURI())

El Javascript establece la cookie sin ruta para que el navegador la muestre como cookie solo para la página actual. Si trato de enviar la cookie caducada con path == /el navegador, se muestran dos cookies: una caducada path == /y otra con path == current page.

UR6LAD
fuente