147 votes

Comment supprimer un cookie dans une servlet Java ?

Comment supprimer un cookie dans une servlet Java ?

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

EDIT : Ce qui suit fonctionne maintenant avec succès, il semble que ce soit 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);

Ce qui expire le cookie lorsque le navigateur est fermé, conformément à la politique de l'UE. la documentation .

Une valeur négative signifie que le cookie n'est pas stocké de manière persistante et qu'il sera supprimé lorsque le navigateur Web quittera. Une valeur nulle entraîne la suppression du cookie.

Le code complet pour faire expirer un cookie est le suivant :

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

150voto

Curt Sampson Points 10866

La valeur MaxAge de -1 indique que vous souhaitez que le cookie persiste pendant toute la durée de la session. Il est préférable de définir MaxAge sur 0.

De la Documentation de l'API :

Une valeur négative signifie que le cookie n'est pas stocké de manière persistante et qu'il sera supprimé lorsque le navigateur Web quittera. Une valeur nulle entraîne la suppression du cookie.

74voto

wu liang Points 611

Dans mon environnement, le code suivant fonctionne. Bien qu'il 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 (int i = 0; i < cookies.length; i++) {
            cookies[i].setValue("");
            cookies[i].setPath("/");
            cookies[i].setMaxAge(0);
            resp.addCookie(cookies[i]);
        }
}

14voto

broofa Points 21663

N'oubliez pas qu'un cookie est en fait défini par le tuple de son nom, de son chemin et de son domaine. Si l'un de ces trois éléments est différent, ou s'il existe plus d'un cookie du même nom, mais défini avec des chemins/domaines qui peuvent encore être visibles pour l'URL en question, vous verrez toujours ce cookie transmis lors de la requête. 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 devoir fonctionner, tant qu'un seul cookie est 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 quand même 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 d'eux pour voir le domaine et le chemin. Je parie que vous en trouverez un qui n'est pas tout à fait ce que vous attendez.

8voto

Kevin Hakanson Points 15498

Il s'agit d'un code que j'ai déjà utilisé de manière efficace, en faisant passer "/" 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;
}

8voto

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X