Come si rimuove un cookie in un servlet Java

Come si rimuove un cookie in un servlet Java?

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

EDIT: Quanto segue ora funziona correttamente sembra essere la combinazione di:

response.setContentType("text/html"); 

e

 cookie.setMaxAge(0); 

Prima che 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 secondo la documentazione .

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

Lo snippet di lavoro completo per la scadenza di 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); 

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

Dalla documentazione dell’API :

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

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

Tieni presente che un cookie è effettivamente definito dalla tupla del suo nome, percorso e 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. Ad esempio, se l’url è ” http://foo.bar.com/baz/index.html “, vedrai i cookie definiti su bar.com o foo.bar.com o con il percorso “/” o “/ baz”.

Quindi, quello che hai sembra dovrebbe funzionare, a patto che ci sia un solo cookie definito nel client, 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.

Questo è il codice che ho usato in precedenza, 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; } 
 Cookie[] cookies = request.getCookies(); if(cookies!=null) for (int i = 0; i < cookies.length; i++) { cookies[i].setMaxAge(0); } 

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

Un caso speciale: un cookie non ha percorso.

In questo caso, imposta path come cookie.setPath(request.getRequestURI())

Javascript imposta 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 path == / e un altro con path == current page .