it-swarm.com.de

Wie entferne ich ein Cookie in einem Java Servlet?

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

Wobei das Cookie nach dem Schließen des Browsers abläuft die Dokumentation .

Ein negativer Wert bedeutet, dass das Cookie nicht dauerhaft gespeichert wird und gelöscht wird, wenn der Webbrowser beendet wird. Ein Nullwert bewirkt, dass das Cookie gelöscht wird.

Der vollständige Funktionsausschnitt 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);
128
Dougnukem

Das Maximum von -1 gibt an, 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 gelöscht wird, wenn der Webbrowser beendet wird. Ein Nullwert bewirkt, dass das Cookie gelöscht wird.
128
Curt J. Sampson

In meiner Umgebung funktioniert der folgende Code. Obwohl es auf den ersten Blick redundant aussieht, sind cookies[i].setValue(""); und cookies[i].setPath("/"); erforderlich, um das Cookie ordnungsgemäß 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);
        }
}
56
wu liang

Denken Sie daran, dass ein Cookie tatsächlich durch das Tupel seines Namens, Pfads und seiner Domäne definiert wird. Wenn sich eines dieser drei Elemente unterscheidet 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 dieses Cookie weiterhin an die Anforderung weitergeleitet. Z.B. Wenn die URL " http://foo.bar.com/baz/index.html " lautet, werden alle auf bar.com oder foo.bar.com oder mit einem definierten Cookies angezeigt Pfad von "/" oder "/ baz".

Wie es aussieht, sollte es also 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 Cookie weiterhin an den Client gesendet.

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 jeweils auf, um die Domäne und den Pfad anzuzeigen. Ich wette, Sie werden einen finden, der nicht ganz Ihren Erwartungen entspricht.

12
broofa
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 eine Antwort zurückgesendet wird.

7
aholbreich

Dies ist Code, den ich zuvor effektiv verwendet habe, indem ich "/" als strPath-Parameter.

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

    return cookie;
}
6
Kevin Hakanson

Ein besonderer Fall: Ein Cookie hat keinen Pfad.

In diesem Fall setze Pfad als cookie.setPath(request.getRequestURI())

Das Javascript setzt Cookie ohne Pfad, so dass der Browser es nur für die aktuelle Seite als Cookie anzeigt. Wenn ich versuche, den abgelaufenen Cookie mit path == / Der Browser zeigt zwei Cookies an: eines ist abgelaufen mit path == / und eine andere mit path == current page.

0
UR6LAD