微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/html/232400.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐