Jak usunąć plik cookie w serwlecie Java

135

Jak usunąć plik cookie z serwletu Java?

Próbowałem tego: http://www.jguru.com/faq/view.jsp?EID=42225

EDYCJA: Teraz działa pomyślnie, wydaje się, że jest to kombinacja:

response.setContentType("text/html");

i

cookie.setMaxAge(0);

Zanim to zrobiłem:

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

Który wygasa plik cookie po zamknięciu przeglądarki zgodnie z dokumentacją .

Wartość ujemna oznacza, że ​​plik cookie nie jest trwale przechowywany i zostanie usunięty po zamknięciu przeglądarki internetowej. Wartość zerowa powoduje usunięcie pliku cookie.

Pełny działający fragment kodu wygaśnięcia pliku cookie to:

//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
źródło

Odpowiedzi:

137

Wartość MaxAge równa -1 sygnalizuje, że plik cookie ma być przechowywany przez cały czas trwania sesji. Zamiast tego chcesz ustawić MaxAge na 0.

Z dokumentacji API :

Wartość ujemna oznacza, że ​​plik cookie nie jest trwale przechowywany i zostanie usunięty po zamknięciu przeglądarki internetowej. Wartość zerowa powoduje usunięcie pliku cookie.
cjs
źródło
9
Początkowo próbowałem setMaxAge (0) w przeglądarce Firefox, ale nadal widziałem, że w moich plikach cookie jest to „Wygasa: na koniec sesji” i pomyślałem, że mój serwlet nadal otrzymuje ten wygasły plik cookie. Może to być kombinacja konieczności ustawienia response.setContentType ("text / html"); i setMaxAge (0); to sprawiło, że w końcu zadziałało. Próbowałem ponownie i wygląda na to, że plik cookie z setMaxAge (0) nie będzie wysyłany w kolejnych żądaniach do moich serwletów Java.
Dougnukem
62

W moim środowisku działa następujący kod. Chociaż na pierwszy rzut oka wygląda na zbędne cookies[i].setValue("");i cookies[i].setPath("/");są konieczne do prawidłowego wyczyszczenia pliku cookie.

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
źródło
1
Wydaje się, że działa to konsekwentnie we wszystkich przeglądarkach.
ug_
5
Nie jestem pewien, czy powinieneś ustawić wartość lub ścieżkę pliku cookie, ponieważ może to być postrzegane jako inny plik cookie, prawda? Aby wyczyścić plik cookie, ustaw maksymalny wiek na 0.
Szary
2
Cookie.setPath (...) musi pasować do ścieżki użytej podczas tworzenia pliku cookie (taka sama dla nazwy pliku cookie i domeny).
markus
12

Pamiętaj, że plik cookie jest w rzeczywistości definiowany przez krotkę jego nazwy, ścieżki i domeny. Jeśli którykolwiek z tych trzech jest inny lub istnieje więcej niż jeden plik cookie o tej samej nazwie, ale zdefiniowany ze ścieżkami / domenami, które mogą być nadal widoczne dla danego adresu URL, nadal będziesz widzieć ten plik cookie przekazany w żądaniu. Np. Jeśli adres URL to „ http://foo.bar.com/baz/index.html ”, zobaczysz wszystkie pliki cookie zdefiniowane na bar.com lub foo.bar.com lub ze ścieżką „/” lub „/ baz”.

Tak więc wygląda na to, że powinno działać, o ile w kliencie zdefiniowano tylko jeden plik cookie o nazwie „SSO_COOKIE_NAME”, domenie „SSO_DOMAIN” i ścieżce „/”. Jeśli istnieją pliki cookie z inną ścieżką lub domeną, nadal będziesz widzieć plik cookie wysłany do klienta.

Aby to debugować, przejdź do preferencji przeglądarki Firefox -> karta Bezpieczeństwo i wyszukaj wszystkie pliki cookie za pomocą SSO_COOKIE_NAME. Kliknij każdą, aby zobaczyć domenę i ścieżkę. Założę się, że znajdziesz tam taki, którego nie spodziewasz się.

broofa
źródło
Chociaż może być również tak, że nazwa lub ścieżka nie jest nazwą lub ścieżką pliku cookie, który przegląda w przeglądarce (po ustaleniu wartości MaxAge), obecność lub brak innych plików cookie nie ma nic wspólnego ze stanem, obecnością lub brakiem konkretny plik cookie, który ustawia.
cjs
8
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

czy to nie zadziałało? Spowoduje to usunięcie wszystkich plików cookie, jeśli odpowiedź zostanie odesłana.

aholbreich
źródło
15
Nie zapomnij dodać zmienionego pliku cookie z powrotem do odpowiedzi za pomocą response.addCookie (cookies [i]);
Philihp Busby
7

Jest to kod, którego skutecznie używałem wcześniej, przekazując "/"jako parametr strPath.

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

    return cookie;
}
Kevin Hakanson
źródło
0

Jeden szczególny przypadek: plik cookie nie ma ścieżki.

W takim przypadku ustaw ścieżkę jako cookie.setPath(request.getRequestURI())

JavaScript ustawia plik cookie bez ścieżki, więc przeglądarka wyświetla go jako plik cookie tylko dla bieżącej strony. Jeśli spróbuję wysłać wygasły plik cookie za path == /pomocą przeglądarki, wyświetlają się dwa pliki cookie: jeden wygasł z, path == /a drugi z path == current page.

UR6LAD
źródło