2009-02-21 3 views
24

Ich bin ein .NET-Entwickler, der beginnt, in Java zu dabbeln.Warum kommen Cookie-Werte mit Leerzeichen auf der Clientseite mit Anführungszeichen an?

In .NET, kann ich den Wert eines Cookies in einen String mit weißen Raum in ihm gesetzt: new HttpCookie("myCookieName", "my value") - und wenn ich diesen Wert auf der Client-Seite (JavaScript) lesen, bekomme ich den Wert ich erwartet habe (meine Wert).

Wenn ich das gleiche in einem Java-Servlet tun - new Cookie("myCookieName", "my value"), bekomme ich den Wert einschließlich der doppelten Anführungszeichen ("mein Wert").

Warum der Unterschied? Fehle ich etwas? Wie gehen Menschen damit in der Java-Welt um? Codieren Sie den Wert und dekodieren Sie dann auf der Client-Seite?

Antwort

2

Wahrscheinlich hat es damit zu tun, wie Java den Cookie codiert. Ich schlage vor, Sie versuchen, setVersion(1) auf dem neuen Cookie aufrufen und sehen, ob das für Sie funktioniert.

+0

'setVersion (1)' wird nicht für IE funktionieren. –

5

Soweit ich weiß, müssen Leerzeichen in Cookies codiert sein. Verschiedene Browser reagieren unterschiedlich auf nicht codierte Cookies. Sie sollten Ihr Cookie vor der Einstellung URL-codieren.

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

ASP.NET macht die Codierung automatisch, in Java müssen Sie es selbst tun. Ich vermute, dass die Anführungszeichen, die Sie sehen, vom Benutzeragenten hinzugefügt werden.

0

Versuchen Sie es mit setVersion (0).

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

druckt:

name = "mehrere Wortwert"

Aber nach

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

druckt Einstellung:

name = mehrere Wortwert

Encoding ist ebenfalls eine gute Idee, aber die Anführungszeichen um den Wert scheinen ein unabhängiges Problem zu sein.

+1

Version 0 lässt keinen Leerraum in Cookies zu. –

40

Wenn Sie mit einem der folgenden Werte ein Cookie Wert gesetzt als

Mit Version 0 Cookies in Cookie#setValue(), erwähnt, Werte sollten nicht Leerzeichen enthalten, Klammern, Klammern, Gleichheitszeichen, Kommata, doppelte Anführungszeichen Schrägstriche, Fragezeichen, Zeichen, Doppelpunkte und Semikolons. Leere Werte verhalten sich möglicherweise nicht in allen Browsern gleich.

dann die durchschnittlichen Behälter gesetzt implizit das Cookie auf Version 1 (RFC 2109 spec) anstelle der Standard-Version 0 (Netscape spec). Das Verhalten wird nicht von der Servlet-API angegeben, es ist dem Container freigestellt, es zu implementieren (es kann zum Beispiel einige IllegalArgumentException werfen). Soweit ich weiß, verhalten sich Tomcat, JBoss AS und Glassfish hinsichtlich der impliziten Änderung der Cookie-Version gleich. Für Tomcat und JBoss AS ist dies die Folge von Fixes für this security issue.

Eine Version 1 Cookie sieht wie folgt aus:

name="value with spaces";Max-Age=3600;Path=/;Version=1

während eine Version 0 kompatibel Cookie sieht wie folgt aus:

name=value%20with%20spaces;Expires=Mon, 29-Aug-2011 14:30:00 GMT;Path=/

(beachten Sie, dass eine URL-codierten Wert für die Version 0 gültig ist)

Wichtiger Hinweis: Microsoft Internet Explorer unterstützt keine Cookies der Version 1. Sogar nicht die aktuelle Version von IE 11. Es interpretiert die Anführungszeichen, die Teil des gesamten Cookie-Werts sind, und behandelt und gibt das entsprechend zurück. Das Attribut Max-Age wird nicht unterstützt und ignoriert es vollständig, was dazu führt, dass die Lebensdauer des Cookies standardmäßig der Browsersitzung entspricht. Sie haben anscheinend IE verwendet, um die Cookie-Handhabung Ihrer Webanwendung zu testen.

Um MSIE auch zu unterstützen, müssen Sie URL-Codierung und URL-dekodieren den Cookie-Wert selbst wirklich, wenn es möglicherweise Zeichen enthält, die Version 0.

Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8")); 
// ... 

und

String value = URLDecoder.decode(cookie.getValue(), "UTF-8")); 
// ... 
für ungültig

Um Version 1-Cookies für die weltweite Zielgruppe zu unterstützen, werden Sie wirklich darauf warten, dass Microsoft den Mangel an MSIE-Unterstützung behebt und dass der Browser mit dem Fix Mainstream geworden ist. Mit anderen Worten, es dauert Alter (Update: ab sofort, 5+ Jahre später, scheint es nicht zu passieren). In der Zwischenzeit sollten Sie sich am besten an kompatible Cookies der Version 0 halten.

Verwandte Themen