2009-05-21 16 views
117

Come si rimuove un cookie in un servlet Java?Come si rimuove un cookie in una servlet Java

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

EDIT: Il seguente ora funziona con successo sembra essere la combinazione di:

response.setContentType("text/html"); 

e

cookie.setMaxAge(0); 

Prima stavo 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 quando il browser viene chiuso come da the documentation.

Un valore negativo significa che il cookie non viene memorizzato in modo persistente e verrà eliminato alla chiusura del browser. Un valore zero provoca la cancellazione del cookie.

Il frammento di lavoro completo per 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); 

risposta

117

Il MaxAge di -1 segnala che il cookie deve persistere per la durata della sessione. Vuoi invece impostare MaxAge a 0.

Dal API documentation:

Un valore negativo significa che il cookie non viene memorizzato in modo persistente e sarà cancellata quando il browser Web esce. Un valore zero provoca la cancellazione del cookie.
+8

Ho provato setMaxAge (0) inizialmente in firefox ma l'ho visto ancora elencato nei miei cookies come "Scade: alla fine della sessione" e pensavo che il mio servlet stesse ancora ricevendo quel cookie scaduto. Potrebbe essere stata una combinazione di dover impostare il response.setContentType ("text/html"); e setMaxAge (0); che ha finalmente funzionato. Ho provato di nuovo e sembra che il cookie con setMaxAge (0) non verrà inviato nelle richieste successive ai miei servlet Java. – Dougnukem

+0

Risposta chiara e utile, grazie. –

11

Tenete a mente che un cookie è in realtà definita dalla tupla di suo nome, il percorso e il dominio. Se uno di questi tre è diverso o è presente più di un cookie con lo stesso nome, ma è definito con percorsi/domini che possono ancora essere visibili per l'URL in questione, continuerai a vedere che il cookie è stato trasmesso alla richiesta. Per esempio. se l'url è "http://foo.bar.com/baz/index.html", vedrai i cookie definiti su bar.com o foo.bar.com, o con un percorso di "/" o "/ baz".

Quindi, 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 percorso o dominio diversi, vedrai comunque il cookie inviato al cliente.

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

+0

Mentre potrebbe anche essere che il nome o il percorso non è quello del biscotto sta guardando nel browser (una volta che fissa il valore MaxAge), la presenza o l'assenza di altri cookie non ha nulla a che fare con la stato, presenza o assenza del particolare cookie che sta impostando. –

6

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; 
} 
6
Cookie[] cookies = request.getCookies(); 
if(cookies!=null) 
for (int i = 0; i < cookies.length; i++) { 
cookies[i].setMaxAge(0); 
} 

ha fatto che non ha funzionato? Questo rimuove tutti i cookie se la risposta viene rispedita.

+11

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

50

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

Sembra funzionare in modo coerente su tutti i browser. –

+0

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, è necessario impostare solo il valore max-age su 0. – Gray

Problemi correlati