6 Stimmen

Problem beim Entfernen von Cookies im Servlet

Ich versuche, ein Cookie in einem Servlet mit folgendem Code zu entfernen

Cookie minIdCookie = null;

for (Cookie c : req.getCookies()) {
    if (c.getName().equals("iPlanetDirectoryPro")) {
        minIdCookie = c;
        break;
    }
}

if (minIdCookie != null) {
    minIdCookie.setMaxAge(0);
    minIdCookie.setValue("");
    minIdCookie.setPath("/");
    res.addCookie(minIdCookie);
}

res.flushBuffer();

Dies hat jedoch keine Auswirkungen und führt zu keiner Änderung der Cookie-Eigenschaften.

Ich habe auch versucht, ein Cookie in dieses Servlet einzufügen, und das funktioniert gut.

Warum kann ich die Eigenschaften eines vorhandenen Cookies nicht ändern?

7voto

BalusC Punkte 1034465

Sie sollten den Pfad nicht ändern. Dies würde die Identität des Cookies ändern. Wenn das Cookie für einen Pfad wie /foo und Sie ändern dies in / dann wird der Client das geänderte Cookie nicht mehr mit dem ursprünglichen Cookie in Verbindung bringen. Ein Cookie wird durch den Namen und den Pfad identifiziert.

Es sollte ausreichen, die Höchstmenge auf 0 zu setzen.

Cookie[] cookies = request.getCookies();
if (cookies != null) { // Yes, this can return null! The for loop would otherwise throw NPE.
    for (Cookie cookie : cookies) {
        if (cookie.getName().equals("iPlanetDirectoryPro")) {
            cookie.setMaxAge(0);
            response.addCookie(cookie);
            break;
        }
    }
}

Sie müssen auch sicherstellen, dass Sie das Cookie in der folgenden Phase lesen/testen neu Anfrage, nicht in der aktuellen Anfrage.

4voto

Ich weiß, dass dieses Thema schon ein paar Jahre alt ist, aber die Antwort, die BalusC oben gegeben hat, ist nicht ganz korrekt, und auch Stefans akzeptierte Antwort enthält nicht wirklich alle Details.

Der Pfad und die Domäne sind immer Null, wenn Sie Cookies in Java abrufen, da sie nur in der Antwort für den Client-Browser erforderlich sind. Wenn Sie sich jedoch in der gleichen Sicherheitsdomäne befinden (unabhängig vom Pfad), haben Sie immer noch das Recht, sie zu löschen. Da der Pfad nicht enthalten ist, können Sie das Cookie leider nicht löschen, ohne diesen Pfad explizit zu kennen. Einfach denselben Cookie-Namen, aber einen anderen Pfad zu verwenden, funktioniert nicht. Es handelt sich dann um zwei verschiedene Cookies, und Sie werden feststellen, dass Sie, anstatt das Cookie zu löschen, einfach ein neues unter einem anderen Pfad angelegt haben.

Das andere Problem, das die meisten Entwickler haben, ist, dass sie versuchen, das Fehlen von Cookies zu überprüfen, bevor die Antwort übermittelt wurde. Ein Cookie wird erst dann entfernt, wenn der Client-Browser die Antwort lesen und aus dem Dateisystem entfernen kann. Wenn Sie zu einem anderen Servlet weiterleiten, in der Hoffnung, dass Sie ein Cookie gelöscht haben, werden Sie feststellen, dass es immer noch existiert (da die ursprüngliche Anfrage dieselbe ist). In diesem Sinne sind Anfrageattribute eine viel bessere Option.

4voto

ath j Punkte 335

Meistens liegt das Problem am Pfad des Cookies. Achten Sie also darauf, dass Sie den Pfad angeben, wenn Sie ein Cookie erstellen. Und verwenden Sie dann denselben Pfad, wenn Sie ein Cookie verwerfen. Das Konzept des Pfades ist

public String getPath() public void setPath(String p holen oder setzen den Pfad, für den das Cookie gilt. Wenn Sie keinen Pfad angeben, gibt der Browser das Cookie nur an URLs zurück, die im oder unterhalb des Verzeichnis, das die Seite enthält, die das Cookie gesendet hat. Zum Beispiel, wenn der Server das Cookie gesendet hat von //ecommerce.site.com/toys/specials.html gesendet hat, würde der Browser das Cookie zurück, wenn er eine Verbindung zu //ecommerce.site.com/toys/bikes/beginners.html, aber nicht zu //ecommerce.site.com/cds/classical.html. Die setPath-Methode kann kann verwendet werden, um etwas Allgemeineres festzulegen. [ ] someCookie.setPath("/") gibt an, dass alle Seiten des Servers das Cookie erhalten sollen. Der angegebene Pfad muss die aktuelle Seite enthalten; Das heißt, Sie können einen allgemeineren Pfad als den Standardpfad angeben, aber keinen einen spezifischeren. So kann zum Beispiel ein Servlet unter //host/store/cust-service/request einen Pfad von /store/ angeben (da /store/ /store/cust-service/ einschließt), nicht aber einen Pfad von /store/cust-service/returns/ (da dies /store/cust-service/ enthält).

Weitere Informationen zu den Eigenschaften von Pfaden und Cookies erhalten Sie unter aquí .

0voto

Stefan Rasmusson Punkte 5311

Das Problem war, dass das Cookie, das ich entfernen wollte, den Pfad "/admin" hatte und mein Logout-Servlet den Pfad "/admin/logoutServlet". Wenn ich das Cookie von der Anfrage erhalte, wird der Pfad auf null gesetzt. Wenn ich also das Cookie hinzufüge, wird der Pfad auf "/admin/" gesetzt, da mein ServletWenn ich ein Cookie mit dem Pfad "/admin/" erstellt habe, konnte das Servlet es entfernen.

Ich habe das Problem gelöst, indem ich den Pfad des Cookies explizit festgelegt habe, bevor ich ihn zur Antwort hinzufügte.

minIdCookie.setMaxAge(0);
minIdCookie.setPath("/");
res.addCookie(minIdCookie);

Aber ich verstehe nicht, warum der Pfad ungültig ist.

0voto

Ich denke, es ist besser, die null anstelle einer leeren Zeichenkette. d.h. ändern Sie minIdCookie.setValue(""); a minIdCookie.setValue(null);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X