web-dev-qa-db-fra.com

Comment supprimer un cookie dans un servlet Java

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

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 persistante et sera supprimé à la fermeture du navigateur Web. Une valeur nulle entraîne la suppression du cookie.

L'extrait de travail complet destiné à 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);
128
Dougnukem

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

De la documentation de l'API :

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

Dans mon environnement, le code suivant fonctionne. Bien que l’apparence soit redondante au premier abord, cookies[i].setValue(""); et cookies[i].setPath("/"); sont nécessaires pour supprimer le cookie correctement.

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);
        }
}
56
wu liang

Gardez à l'esprit qu'un cookie est en réalité défini par le tuple de son nom, de son chemin et de son domaine. Si l'un de ces trois types est différent ou s'il existe plusieurs cookies du même nom, mais définis avec des chemins/domaines susceptibles d'être encore visibles pour l'URL en question, vous verrez toujours ce cookie transmis à 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, votre apparence devrait 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 existe des cookies avec un chemin ou un domaine différent, vous verrez toujours le cookie envoyé au client.

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

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

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

7
aholbreich

C'est le 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;
}
6
Kevin Hakanson

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

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

Le javascript définit le cookie sans chemin d'accès afin que le navigateur l'affiche comme cookie pour la page actuelle uniquement. Si j'essaie d'envoyer le cookie expiré avec path == / le navigateur affiche deux cookies: l’un expiré avec path == / et un autre avec path == current page.

0
UR6LAD