2009-11-11 16 views
7

Tutti,Impostazione cookie persistente da Java non funziona in IE

Anche se vedo argomenti correlati sul forum, ma non vedo una soluzione chiara su questo tema. Sto provando a impostare javax.servlet.http.Cookie con una scadenza (in modo che permanga nelle sessioni del browser). Codice:

public void respond(HttpServletRequest req, HttpServletResponse resp) { 
    int expiration = 3600; 
    Cookie cookie = new Cookie("TestCookie", "xyz"); 
    cookie.setDomain(""); 
    cookie.setVersion(0); 
    cookie.setPath("/"); 
    cookie.setMaxAge(expiration); 
    cookie.setSecure(false); 
    resp.addCookie(cookie); 
} 

Non vedo questo cookie impostato quando controllo gli strumenti di sviluppo di IE. La ricerca su Internet mi ha dato indizi sul fatto che IE non considera Max-Age, ma funziona solo con Expires. Se questo non funziona per IE, c'è un modo comprovato di impostare le intestazioni delle risposte HTTP per un cookie persistente in modo che funzioni per IE?

PS: Funziona bene su tutti gli altri browser.

Ho provato a creare una stringa per il cookie con attributo di scadenza. IE è riuscito a crearlo, ma ha perso il dominio (predefinito - "") e ha mostrato ".com" e lo ha trasformato in un cookie di sessione invece di un cookie persistente. Questo funziona ancora bene su tutti gli altri browser.

Per favore aiuto. Grazie.

+0

Quale versione di IE? –

+1

Qualsiasi versione di IE, in particolare IE8 – thebigg

risposta

1

La risposta è Persistent cookies from a servlet in IE.

Il tuo caso potrebbe essere diverso per lo stesso problema: ovvero, aggiungendo il prefisso al dominio con un "." (che sono abbastanza sicuro è una caratteristica di cookie versione 1), qualcosa nello stack Java decide che è un cookie versione 1 (non riconosciuto e non persistente da IE, anche IE8) e invia quel formato di cookie.

Oppure, come suggerisce la risposta, c'è qualcosa nel valore del cookie che contiene un carattere non riconosciuto?

1

Poiché javax.servlet.http.Cookie non consente di impostare l'attributo Expires nel cookie, è necessario impostarlo manualmente.

è anche bisogno di sapere che Expires deve essere specificato sotto forma di Wdy, DD Mon YYYY HH:MM:SS GMT seguente RFC-2616 sezione data completa (more info).

In Java si può fare in questo modo:

public void respond(HttpServletRequest req, HttpServletResponse resp) { 
    int expiration = 3600; 
    StringBuilder cookie = new StringBuilder("TestCookie=xyz; "); 

    DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss 'GMT'", Locale.US); 
    Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.SECOND, 3600); 
    cookie.append("Expires=" + df.format(cal.getTime()) + "; "); 

    cookie.append("Domain=; "); 
    cookie.append("Version=0; "); 
    cookie.append("Path=/; "); 
    cookie.append("Max-Age=" + expiration + "; "); 
    cookie.append("Secure; "); 
    resp.setHeader("Set-Cookie", cookie.toString()); 
} 
+0

Solo per dire che "GMT" nel formato data sopra può essere impostato con 'z', senza le virgolette singole. (Questo leggerà quindi il fuso orario dal locale passato). – anotherdave

4

Lavorando con IE9, ho scoperto che era l'attributo HttpOnly che è stato richiesto al fine di ottenere per eco il valore del cookie sul post successivi, ad esempio, :

Set-Cookie: autologCk1=ABCD; Path=/autolog/; HttpOnly