2009-02-21 9 views
24

Jestem programistką .NET, która zaczyna ćwiczyć w Javie.Dlaczego wartości cookie z białymi znakami docierają do klienta po cudzysłowach?

W .NET, mogę ustawić wartość pliku cookie na ciąg z białą spacją w nim: new HttpCookie("myCookieName", "my value") - i kiedy odczytam tę wartość po stronie klienta (JavaScript), otrzymuję wartość, której oczekiwałem (mój wartość).

Jeśli zrobię to samo w servletie Javy - new Cookie("myCookieName", "my value"), otrzymam wartość obejmującą podwójne cudzysłowy ("moja wartość").

Dlaczego różnica? Czy czegoś brakuje? Jak ludzie radzą sobie z tym w świecie Java? Czy kodujesz wartość, a następnie dekodujesz po stronie klienta?

Odpowiedz

2

To prawdopodobnie ma związek ze sposobem, w jaki Java koduje plik cookie. Proponuję spróbować zadzwonić pod numer setVersion(1) na nowym pliku cookie i sprawdzić, czy to działa.

+0

'setVersion (1)' nie będzie działać dla IE. –

5

O ile mi wiadomo, spacje muszą być zakodowane w ciasteczkach. Różne przeglądarki reagują inaczej na niekodowane pliki cookie. Przed skonfigurowaniem pliku cookie powinieneś zakodować plik URL.

String cookieval = "my value"; 
String cookieenc = URLEncoder.encode(cookieval, "UTF-8"); 
res.addCookie(new Cookie("myCookieName", cookieenc)); 

Program ASP.NET wykonuje kodowanie automatycznie, w Javie trzeba to zrobić samodzielnie. Podejrzewam, że widoczne cytaty są dodawane przez klienta użytkownika.

0

Spróbuj użyć funkcji setVersion (0).

HttpCookie cookie = new HttpCookie("name", "multi word value"); 
System.out.println(cookie.toString()); 

drukuje:

name = "kilka Wartość słowo"

ale po ustawieniu

cookie.setVersion(0); 
System.out.println(cookie.toString()); 

wydruki:

name = kilka wartości słowo

Kodowanie to również dobry pomysł, ale cytaty dotyczące wartości wydają się być niezależną kwestią.

+1

Wersja 0 nie dopuszcza spacji w ciasteczkach. –

40

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.

Powiązane problemy