Servlets ServletExec中Cookie值缺少双引号和尾随等号

Servlets ServletExec中Cookie值缺少双引号和尾随等号,servlets,cookies,Servlets,Cookies,我有一个servlet应用程序,它将cookies存储为base64编码字符串。在应用程序在ServletExec上运行的服务器上,Cookie的值不会用引号括起来。此外,如果该值以“=”字符结尾,则该字符将被删除。缺少的引号和尾随“=”会阻止正确解析Cookie值。在其他两台服务器中,此应用程序运行在ServletExec和Tomcat上,并且此应用程序正在运行,Cookie用双引号括起来,并且尾随的“=”符号不会被删除 如浏览器的开发人员工具所示: 错误-cookiename:dGVzdHN

我有一个servlet应用程序,它将cookies存储为base64编码字符串。在应用程序在ServletExec上运行的服务器上,Cookie的值不会用引号括起来。此外,如果该值以“=”字符结尾,则该字符将被删除。缺少的引号和尾随“=”会阻止正确解析Cookie值。在其他两台服务器中,此应用程序运行在ServletExec和Tomcat上,并且此应用程序正在运行,Cookie用双引号括起来,并且尾随的“=”符号不会被删除

如浏览器的开发人员工具所示:

错误-cookiename:dGVzdHN0cmluZzE

应为-cookiename:“dGVzdHN0cmluZzE=”


知道去掉引号和后面的“=”符号是什么吗?蒂亚

默认情况下,servlet
Cookie
类遵循。以下是一个引述自:

此类支持版本0(由Netscape提供)和版本1(由RFC2109提供)cookie规范。默认情况下,Cookie是使用版本0创建的,以确保最佳互操作性

版本0 cookie值在允许的字符中有限制。它只允许URL安全字符。其中包括字母数字字符(a-z、a-z和0-9)和少数词汇字符,包括
-
\u
~
%
。版本0 cookie中的所有其他字符都无效,包括
=
。如果服务器尚未执行此操作,浏览器将吞下无效字符

您最好的选择是对这些字符进行URL编码。这样,URL中不允许的每个字符都将按百分比编码为此表单
%xx
,该表单作为cookie值有效

因此,在创建cookie时,请执行以下操作:

Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
// ...
阅读cookie时,请执行以下操作:

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

另一种方法是通过
Cookie#setVersion()切换到版本1 Cookie
,但这在IEThank you中不受支持。您知道是否可以通过Servletexec或Tomcat中的配置来设置cookie规范版本吗?我只是被一个事实弄糊涂了,即相同的应用程序在运行Servletexec的两台服务器中的行为不同。一些服务器(Tomcat、JBoss等)当您将错误字符设置为cookie变量时,隐式更改为版本1。这是修复安全错误的结果。但是,IE用户将失败(它不遵守最大值,cookie将作为会话cookie)。