servlets – 为什么带有空格的cookie值到达客户端并带有引号?

前端之家收集整理的这篇文章主要介绍了servlets – 为什么带有空格的cookie值到达客户端并带有引号?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一名开始涉足Java的.NET开发人员。

在.NET中,我可以将cookie的值设置为包含空格的字符串:
新的HttpCookie(“myCookieName”,“我的价值”) – 当我在客户端(JavaScript)上读取该值时,我得到了我期望的值(我的值)。

如果我在Java servlet中执行相同的操作 – 新Cookie(“myCookieName”,“我的值”),我会得到包含双引号(“my value”)的值。

为什么不同?我错过了什么吗?人们如何在Java世界中处理这个问题?您是否对值进行编码,然后在客户端进行解码?

解决方法

当您使用 Cookie#setValue()中提到的以下值之一设置cookie值时,

With Version 0 cookies,values should not contain white space,brackets,parentheses,equals signs,commas,double quotes,slashes,question marks,at signs,colons,and semicolons. Empty values may not behave the same way on all browsers.

那么普通容器将隐式地将cookie设置为版本1(RFC 2109 spec)而不是默认版本0(Netscape spec)。 Servlet API没有指定行为,容器可以自由地实现它(它可能会抛出一些IllegalArgumentException)。据我所知,Tomcat,JBoss AS和Glassfish在隐式更改cookie版本方面表现完全相同。对于至少Tomcat和JBoss AS,这是修复this security issue的结果。

版本1 cookie看起来像这样:

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

而版本0兼容的cookie看起来像这样:

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

(请注意,URL编码的值对版本0有效)

重要说明是Microsoft Internet Explorer不支持版本1 cookie。即便不是当前的IE 11发布。它会将引号解释为整个cookie值的一部分,并将相应地处理和返回。它不支持Max-Age属性,它将完全忽略它,导致cookie的生命周期默认为浏览器会话。您显然正在使用IE来测试您的webapp的cookie处理。

为了支持MSIE,如果它包含可能对版本0无效的字符,则您需要自己对cookie值进行URL编码和URL解码。

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

String value = URLDecoder.decode(cookie.getValue(),"UTF-8"));
// ...

为了支持全球受众的第1版cookie,您真的会等待Microsoft修复缺乏MSIE支持的问题,并且修复后的浏览器已经成为主流。换句话说,它需要很长时间(更新:截至目前,5年后,它似乎永远不会发生)。同时你最好坚持使用版本0兼容的cookie。

原文链接:https://www.f2er.com/html/232400.html

猜你在找的HTML相关文章