Come si rimuove un cookie in un servlet Java


135

Come si rimuove un cookie in un servlet Java?

Ho provato questo: http://www.jguru.com/faq/view.jsp?EID=42225

EDIT: il seguente ora funziona correttamente sembra essere la combinazione di:

response.setContentType("text/html");

e

cookie.setMaxAge(0);

Prima che stessi facendo:

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

Che scade il cookie alla chiusura del browser come da documentazione .

Un valore negativo indica che il cookie non viene archiviato in modo persistente e verrà eliminato all'uscita dal browser Web. Un valore zero provoca l'eliminazione del cookie.

Lo snippet di lavoro completo per far scadere un cookie è:

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

Risposte:


138

La MaxAge di -1 indica che desideri che il cookie persista per la durata della sessione. Si desidera invece impostare MaxAge su 0.

Dalla documentazione API :

Un valore negativo indica che il cookie non viene archiviato in modo persistente e verrà eliminato all'uscita dal browser Web. Un valore zero provoca l'eliminazione del cookie.

9
Ho provato setMaxAge (0) inizialmente in Firefox, ma lo vedevo ancora elencato nei miei cookie come "Scadenza: alla fine della sessione" e pensavo che il mio servlet stesse ancora ricevendo quel cookie scaduto. Potrebbe essere stata una combinazione della necessità di impostare response.setContentType ("text / html"); e setMaxAge (0); che alla fine ha funzionato. L'ho provato di nuovo e sembra che il cookie con setMaxAge (0) non verrà inviato nelle richieste successive ai miei servlet Java.
Dougnukem,

62

Nel mio ambiente, il seguente codice funziona. Anche se a prima vista sembra ridondante, cookies[i].setValue("");e cookies[i].setPath("/");sono necessari per cancellare correttamente il 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);
        }
}

1
Questo sembra funzionare in modo coerente su tutti i browser.
ug_

5
Non sono sicuro che dovresti impostare il valore o il percorso del cookie perché potrebbe essere visto come un cookie diverso, giusto? Per cancellare un cookie devi impostare solo l'età massima su 0.
Gray

2
cookie.setPath (...) deve corrispondere a qualsiasi percorso sia stato utilizzato al momento della creazione del cookie (lo stesso per nome e dominio del cookie).
markus,

12

Tieni presente che un cookie è effettivamente definito dalla tupla di nome, percorso e dominio. Se uno di questi tre è diverso o esiste più di un cookie con lo stesso nome, ma definito con percorsi / domini che potrebbero essere ancora visibili per l'URL in questione, vedrai comunque che il cookie ha inviato la richiesta. Ad esempio, se l'URL è " http://foo.bar.com/baz/index.html ", vedrai tutti i cookie definiti su bar.com o foo.bar.com o con un percorso di "/" o "baz /".

Pertanto, ciò che sembra dovrebbe funzionare, purché nel client sia definito un solo cookie, con il nome "SSO_COOKIE_NAME", il dominio "SSO_DOMAIN" e il percorso "/". Se sono presenti cookie con percorsi o domini diversi, vedrai comunque i cookie inviati al client.

Per eseguire il debug, vai nelle preferenze di Firefox -> scheda Sicurezza e cerca tutti i cookie con SSO_COOKIE_NAME. Fai clic su ciascuno per vedere il dominio e il percorso. Scommetto che ne troverai uno lì che non è proprio quello che ti aspetti.


Mentre potrebbe anche essere che il nome o il percorso non corrisponda a quello del cookie che sta visualizzando nel browser (una volta corretto il valore MaxAge), la presenza o l'assenza di altri cookie non ha nulla a che fare con lo stato, la presenza o l'assenza di il particolare cookie che sta impostando.
cjs,

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

non ha funzionato? Ciò rimuove tutti i cookie se la risposta viene rinviata.


15
Non dimenticare di aggiungere nuovamente il cookie modificato alla risposta con response.addCookie (cookie [i]);
Philihp Busby,

7

Questo è il codice che ho effettivamente utilizzato prima, passando "/"come parametro strPath.

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

    return cookie;
}

0

Un caso speciale: un cookie non ha percorso.

In questo caso impostare il percorso come cookie.setPath(request.getRequestURI())

Javascript imposta i cookie senza percorso, quindi il browser lo mostra come cookie solo per la pagina corrente. Se provo a inviare il cookie scaduto con path == /il browser mostra due cookie: uno scaduto con l' path == /altro con path == current page.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.