Comment supprimer un cookie dans un servlet Java

135

Comment supprimer un cookie dans un servlet Java?

J'ai essayé ceci: http://www.jguru.com/faq/view.jsp?EID=42225

EDIT: Ce qui suit fonctionne maintenant avec succès, il semble être la combinaison de:

response.setContentType("text/html");

et

cookie.setMaxAge(0);

Avant je faisais:

//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);

Qui expire le cookie lorsque le navigateur est fermé selon la documentation .

Une valeur négative signifie que le cookie n'est pas stocké de manière permanente et sera supprimé à la fermeture du navigateur Web. Une valeur nulle entraîne la suppression du cookie.

L'extrait de code complet pour faire expirer un cookie est:

//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
la source

Réponses:

138

Le MaxAge de -1 indique que vous souhaitez que le cookie persiste pendant la durée de la session. Vous souhaitez définir MaxAge à 0 à la place.

À partir de la documentation de l' API :

Une valeur négative signifie que le cookie n'est pas stocké de manière permanente et sera supprimé à la fermeture du navigateur Web. Une valeur nulle entraîne la suppression du cookie.
cjs
la source
9
J'ai essayé setMaxAge (0) initialement dans Firefox, mais je l'ai toujours vu répertorié dans mes cookies comme "Expire: à la fin de la session" et je pensais que mon servlet recevait toujours ce cookie expiré. Cela pourrait avoir été un combo de devoir définir le response.setContentType ("text / html"); et setMaxAge (0); cela a finalement fonctionné. Je l'ai réessayé et il semble que le cookie avec setMaxAge (0) ne sera pas envoyé dans les demandes suivantes à mes servlets Java.
Dougnukem
62

Dans mon environnement, le code suivant fonctionne. Bien que semble redondant à première vue, cookies[i].setValue("");et cookies[i].setPath("/");sont nécessaires pour effacer correctement le cookie.

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
la source
1
Cela semble fonctionner de manière cohérente sur tous les navigateurs.
ug_
5
Je ne suis pas sûr que vous deviez définir la valeur ou le chemin du cookie car cela pourrait être considéré comme un cookie différent, non? Pour effacer un cookie, vous ne devez définir l'âge maximum que sur 0.
Gris
2
cookie.setPath (...) doit correspondre au chemin utilisé lors de la création du cookie (idem pour le nom et le domaine du cookie).
markus
12

Gardez à l'esprit qu'un cookie est en fait défini par le tuple de son nom, son chemin et son domaine. Si l'un de ces trois est différent, ou s'il existe plusieurs cookies du même nom, mais définis avec des chemins / domaines qui peuvent encore être visibles pour l'URL en question, vous verrez toujours ce cookie transmis lors de la demande. Par exemple, si l'url est " http://foo.bar.com/baz/index.html ", vous verrez tous les cookies définis sur bar.com ou foo.bar.com, ou avec un chemin de "/" ou "/ baz".

Ainsi, ce que vous avez semble fonctionner, tant qu'il n'y a qu'un seul cookie défini dans le client, avec le nom "SSO_COOKIE_NAME", le domaine "SSO_DOMAIN" et le chemin "/". S'il y a des cookies avec un chemin ou un domaine différent, vous verrez toujours le cookie envoyé au client.

Pour déboguer cela, allez dans les préférences de Firefox -> onglet Sécurité, et recherchez tous les cookies avec le SSO_COOKIE_NAME. Cliquez sur chacun pour voir le domaine et le chemin. Je parie que vous en trouverez un là-dedans qui n'est pas tout à fait ce que vous attendez.

Broofa
la source
S'il se peut également que le nom ou le chemin ne soit pas celui du cookie qu'il regarde dans le navigateur (une fois qu'il a corrigé la valeur MaxAge), la présence ou l'absence d'autres cookies n'a rien à voir avec l'état, la présence ou l'absence de le cookie particulier qu'il installe.
cjs
8
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

cela n'a pas fonctionné? Cela supprime tous les cookies si la réponse est renvoyée.

aholbreich
la source
15
N'oubliez pas de rajouter le cookie modifié à la réponse avec response.addCookie (cookies [i]);
Philihp Buspar
7

C'est du code que j'ai effectivement utilisé auparavant, en passant "/"comme paramètre strPath.

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

    return cookie;
}
Kevin Hakanson
la source
0

Un cas particulier: un cookie n'a pas de chemin.

Dans ce cas, définissez le chemin comme cookie.setPath(request.getRequestURI())

Le javascript définit le cookie sans chemin afin que le navigateur l'affiche comme cookie pour la page en cours uniquement. Si j'essaye d'envoyer le cookie expiré avec path == /le navigateur, deux cookies sont affichés: un expiré avec path == /et un autre avec path == current page.

UR6LAD
la source