Gdy ustawisz wartość cookie z jednym z następujących wartości, jak wymienione w Cookie#setValue()
,
z wersją 0 ciasteczek, wartości nie powinna zawierać spacji, wsporniki, nawiasów, równa znaki, przecinków, cudzysłowów , ukośniki, znaki zapytania, znaki, dwukropki i średniki. Puste wartości mogą nie działać w taki sam sposób we wszystkich przeglądarkach.
następnie średni pojemnik będzie domyślnie ustawiony plik cookie do wersji 1 (RFC 2109 spec) zamiast domyślnej wersji 0 (Netscape spec). Zachowanie nie jest określone przez API Servlet, kontener może go zaimplementować (może na przykład rzucić jakieś IllegalArgumentException
). O ile mi wiadomo, Tomcat, JBoss AS i Glassfish zachowują się tak samo w odniesieniu do niejawnej zmiany wersji pliku cookie. Dla co najmniej Tomcat i JBoss AS jest to konsekwencja poprawek dla this security issue.
Wersja 1 ciasteczko wyglądać następująco:
name="value with spaces";Max-Age=3600;Path=/;Version=1
natomiast wersja 0 kompatybilny cookies wyglądać następująco:
name=value%20with%20spaces;Expires=Mon, 29-Aug-2011 14:30:00 GMT;Path=/
(zauważ, że wartość URL zakodowany jest ważna dla wersji 0)
Ważną informacją jest to, że Microsoft Internet Explorer nie obsługuje plików cookie w wersji 1. Nawet nie aktualna wersja IE 11. Będzie interpretować cytaty będące częścią całej wartości cookie i odpowiednio to potraktuje i zwróci. Nie obsługuje atrybutu Max-Age
i całkowicie go zignoruje, co powoduje, że okres istnienia pliku cookie jest domyślnie ustawiony na sesję przeglądarki. Najwyraźniej korzystałeś z IE, aby przetestować obsługę ciasteczek w twoim webappie.
Wspieranie MSIE, jak również, co naprawdę trzeba URL kodowania i dekodowania URL wartość cookie, samodzielnie, jeśli zawiera ona możliwie znaki, które są nieważne dla wersji 0.
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
// ...
i
String value = URLDecoder.decode(cookie.getValue(), "UTF-8"));
// ...
Aby obsługiwać ciasteczka w wersji 1 dla odbiorców z całego świata, naprawdę poczekasz, aż Microsoft naprawi brak obsługi MSIE, a przeglądarka z poprawką stanie się głównym nurtem. Innymi słowy, zajmie to wieku (aktualizacja: od teraz, 5+ lat później, wydaje się, że nigdy się nie stanie). Tymczasem najlepiej trzymać się ciasteczek zgodnych z wersją 0.
'setVersion (1)' nie będzie działać dla IE. –