Wie entferne ich ein Cookie in einem Java-Servlet?

135

Wie entferne ich ein Cookie in einem Java-Servlet?

Ich habe Folgendes versucht: http://www.jguru.com/faq/view.jsp?EID=42225

BEARBEITEN: Das Folgende funktioniert jetzt erfolgreich. Es scheint die Kombination von zu sein:

response.setContentType("text/html");

und

cookie.setMaxAge(0);

Bevor ich tat:

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

Das Cookie läuft ab, wenn der Browser gemäß der Dokumentation geschlossen wird .

Ein negativer Wert bedeutet, dass das Cookie nicht dauerhaft gespeichert wird und beim Beenden des Webbrowsers gelöscht wird. Ein Wert von Null bewirkt, dass das Cookie gelöscht wird.

Das voll funktionsfähige Snippet zum Ablaufen eines Cookies lautet:

//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
quelle

Antworten:

137

Das MaxAge von -1 signalisiert, dass das Cookie für die Dauer der Sitzung bestehen bleiben soll. Sie möchten stattdessen MaxAge auf 0 setzen.

Aus der API-Dokumentation :

Ein negativer Wert bedeutet, dass das Cookie nicht dauerhaft gespeichert wird und beim Beenden des Webbrowsers gelöscht wird. Ein Wert von Null bewirkt, dass das Cookie gelöscht wird.
cjs
quelle
9
Ich habe setMaxAge (0) anfangs in Firefox ausprobiert, aber ich sah es in meinen Cookies immer noch als "Läuft ab: am Ende der Sitzung" und dachte, mein Servlet empfange immer noch dieses abgelaufene Cookie. Es könnte eine Kombination gewesen sein, die response.setContentType ("text / html") festlegen zu müssen; und setMaxAge (0); das hat es endlich geschafft. Ich habe es erneut versucht und es scheint, dass das Cookie mit setMaxAge (0) bei nachfolgenden Anforderungen nicht an meine Java-Servlets gesendet wird.
Dougnukem
62

In meiner Umgebung funktioniert der folgende Code. Sieht zwar auf den ersten Blick überflüssig aus cookies[i].setValue("");und cookies[i].setPath("/");ist notwendig, um den Cookie richtig zu löschen.

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
quelle
1
Dies scheint in allen Browsern konsistent zu funktionieren.
ug_
5
Ich bin mir nicht sicher, ob Sie den Wert oder den Pfad des Cookies festlegen sollten, da dies möglicherweise als ein anderes Cookie angesehen wird, oder? Um ein Cookie zu löschen, sollten Sie nur das maximale Alter auf 0 setzen.
Grau
2
cookie.setPath (...) muss mit dem Pfad übereinstimmen, der beim Erstellen des Cookies verwendet wurde (dasselbe gilt für den Namen und die Domäne des Cookies).
Markus
12

Beachten Sie, dass ein Cookie tatsächlich durch das Tupel aus Name, Pfad und Domäne definiert wird. Wenn eines dieser drei Cookies unterschiedlich ist oder mehr als ein Cookie mit demselben Namen vorhanden ist, das jedoch mit Pfaden / Domänen definiert ist, die für die betreffende URL möglicherweise noch sichtbar sind, wird das Cookie weiterhin an die Anforderung übergeben. Wenn die URL beispielsweise " http://foo.bar.com/baz/index.html " lautet, werden auf bar.com oder foo.bar.com oder mit dem Pfad "/" oder "Cookies definiert "/ baz".

So wie es aussieht, sollte es funktionieren, solange im Client nur ein Cookie mit dem Namen "SSO_COOKIE_NAME", der Domäne "SSO_DOMAIN" und dem Pfad "/" definiert ist. Wenn Cookies mit einem anderen Pfad oder einer anderen Domain vorhanden sind, wird das an den Client gesendete Cookie weiterhin angezeigt.

Um dies zu debuggen, gehen Sie in die Einstellungen von Firefox -> Registerkarte Sicherheit und suchen Sie mit SSO_COOKIE_NAME nach allen Cookies. Klicken Sie auf die einzelnen Domänen, um die Domäne und den Pfad anzuzeigen. Ich wette, Sie werden dort einen finden, der nicht ganz Ihren Erwartungen entspricht.

Broofa
quelle
Während es auch sein kann, dass der Name oder Pfad nicht der des Cookies ist, das er im Browser betrachtet (sobald er den MaxAge-Wert festgelegt hat), hat das Vorhandensein oder Fehlen anderer Cookies nichts mit dem Status, dem Vorhandensein oder dem Fehlen von zu tun den speziellen Cookie, den er setzt.
cjs
8
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

hat das nicht geklappt Dadurch werden alle Cookies entfernt, wenn die Antwort zurückgesendet wird.

aholbreich
quelle
15
Vergessen Sie nicht, das geänderte Cookie mit response.addCookie (Cookies [i]) wieder zur Antwort hinzuzufügen.
Philihp Busby
7

Dies ist Code, den ich zuvor effektiv verwendet habe und der "/"als strPath-Parameter übergeben wurde.

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

    return cookie;
}
Kevin Hakanson
quelle
0

Ein Sonderfall: Ein Cookie hat keinen Pfad.

In diesem Fall setzen Sie den Pfad auf cookie.setPath(request.getRequestURI())

Das Javascript setzt Cookies ohne Pfad, sodass der Browser sie nur als Cookie für die aktuelle Seite anzeigt. Wenn ich versuche, das abgelaufene Cookie mit path == /dem Browser zu senden , werden zwei Cookies angezeigt: eines mit path == /und eines mit path == current page.

UR6LAD
quelle