Servlets 为什么带空格的cookie值带引号到达客户端?

Servlets 为什么带空格的cookie值带引号到达客户端?,servlets,cookies,encoding,Servlets,Cookies,Encoding,我是一个开始涉足Java的.NET开发人员 在.NET中,我可以将cookie的值设置为包含空格的字符串: newhttpcookie(“mycokiename”,“我的值”)——当我在客户端(JavaScript)读取该值时,我得到了我期望的值(我的值) 如果我在Java servlet中执行相同的操作-新建Cookie(“mycokiename”,“我的值”),我会得到包含双引号的值(“我的值”) 为什么不同?我错过什么了吗?在Java世界中,人们是如何处理这个问题的?您是否对值进行编码,然

我是一个开始涉足Java的.NET开发人员

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

如果我在Java servlet中执行相同的操作-
新建Cookie(“mycokiename”,“我的值”)
,我会得到包含双引号的值(“我的值”)


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

这可能与Java编码cookie的方式有关。我建议你试着给新的饼干打电话,看看它是否适合你

据我所知,空格必须在cookies中编码。不同的浏览器对未编码的cookie的反应不同。您应该在设置cookie之前对其进行URL编码

String cookieval = "my value";
String cookieenc = URLEncoder.encode(cookieval, "UTF-8");
res.addCookie(new Cookie("myCookieName", cookieenc));
ASP.NET自动进行编码,在Java中,您必须自己进行编码。我怀疑您看到的引号是由用户代理添加的。

尝试使用setVersion(0)

印刷品:

name=“几个单词的值”

但在设定之后

cookie.setVersion(0);
System.out.println(cookie.toString());
印刷品:

名称=多个单词的值


编码也是一个好主意,但是值周围的引号看起来是一个独立的问题。

当您使用中提到的下列值之一设置cookie值时

对于版本0 cookie,值不应包含空格、括号、括号、等号、逗号、双引号、斜杠、问号、at符号、冒号和分号。空值在所有浏览器上的行为方式可能不同

然后,平均容器会隐式地将cookie设置为版本1(),而不是默认版本0()。Servlet API没有指定该行为,容器可以自由实现它(例如,它可能抛出一些
IllegalArgumentException
)。据我所知,Tomcat、JBoss As和Glassfish在隐式更改cookie版本方面的行为都是一样的。至少对于Tomcat和JBoss来说,这是修复的结果

版本1 cookie如下所示:

name="value with spaces";Max-Age=3600;Path=/;Version=1 name=value%20with%20spaces;Expires=Mon, 29-Aug-2011 14:30:00 GMT;Path=/ 及


为了支持面向全球用户的版本1 cookie,您需要等待Microsoft修复MSIE支持的不足,并且具有该修复的浏览器已成为主流。换句话说,这需要很多时间(更新:到目前为止,5年多之后,这似乎永远不会发生)。同时,您最好坚持使用与版本0兼容的Cookie。

版本0不允许Cookie中出现空白。 name=value%20with%20spaces;Expires=Mon, 29-Aug-2011 14:30:00 GMT;Path=/
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
// ...
String value = URLDecoder.decode(cookie.getValue(), "UTF-8"));
// ...