2009-11-11 10 views
7

Wszystko,Ustawianie persistent cookies z Java nie działa w IE

Chociaż widzę pokrewnych tematów na forum, ale nie widzę wyraźną rozwiązanie w tej sprawie. Próbuję ustawić plik javax.servlet.http.Cookie z czasem wygaśnięcia (aby działał w różnych sesjach przeglądarki). Kod:

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

Nie widzę tego pliku cookie podczas sprawdzania narzędzi programistycznych IE. Wyszukiwanie w Internecie dało mi wskazówki, że IE nie bierze pod uwagę Max-Age, ale działa tylko z Expires. Jeśli to nie działa w przypadku IE, czy istnieje sprawdzony sposób ustawiania nagłówków odpowiedzi HTTP na trwały plik cookie, aby działał w IE?

PS: Działa to dobrze we wszystkich innych przeglądarkach.

Próbowałem utworzyć ciąg dla pliku cookie mającego atrybut expires. IE udało się go utworzyć, ale stracił domenę (domyślnie - "") i pokazał ".com" i przekształcił go w sesyjny plik cookie zamiast trwałego pliku cookie. To znowu działa dobrze we wszystkich innych przeglądarkach.

Proszę o pomoc. Dzięki.

+0

Która wersja IE? –

+1

Dowolna wersja IE, konkretnie IE8 – thebigg

Odpowiedz

1

Odpowiedź brzmi: Persistent cookies from a servlet in IE.

Twój przypadek może mieć inny smak tego samego problemu: oznacza to, że przedrostkiem domeny jest "." (co jest prawie pewne, że jest to funkcja cookie w wersji 1), coś w stosie Java decyduje, że jest to plik cookie w wersji 1 (nierozpoznany i nie jest utrzymywany przez IE, nawet IE8) i wysyła ten format plików cookie.

Lub, jak sugeruje ta odpowiedź, czy jest coś w wartości Twojego pliku cookie, która zawiera nierozpoznaną postać?

1

Jako że javax.servlet.http.Cookie nie pozwala ustawić atrybutu Expires na cookie, należy ustawić go ręcznie.

Należy również wiedzieć, że Expires musi być podany w formie Wdy, DD Mon YYYY HH:MM:SS GMT następujące RFC-2616 pełnym przekroju data (more info).

W Javie można zrobić to w ten sposób:

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

Wystarczy wspomnieć, że "GMT" w powyższym formacie daty można ustawić za pomocą "z", bez pojedynczych cudzysłowów. (To by wtedy odczytać strefę czasową z ustawionych locale). – anotherdave

4

Praca z IE9, uważam, że był to atrybut HttpOnly, co było wymagane, aby zmusić go do echa wartość cookie na kolejnych stanowiskach, np :

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