ServletExec中的cookie值缺少双引号和尾随等号

Zoo*_*oom 2 cookies servlets

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

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

坏 - cookiename:dGVzdHN0cmluZzE

预期 - cookiename:"dGVzdHN0cmluZzE ="

知道什么是剥离引号和尾随'='符号?TIA!

Bal*_*usC 5

默认情况下,servlet Cookie类遵循Version 0 cookie规范.这是来自javadoc的引用:

此类支持版本0(通过Netscape)和版本1(通过RFC 2109)cookie规范.默认情况下,使用版本0创建cookie以确保最佳的互操作性.

版本0 cookie值在允许的字符中是限制性的.它只允许URL安全字符.这包括在其他的字母数字字符(az,AZ和0-9),只有少数词汇字符,包括-,_,.,~%.所有其他字符在版本0 cookie中无效,包括"=.如果服务器尚未执行此操作,浏览器将吞下无效字符.

最好的办法是对这些字符进行URL编码.这样,URL中不允许的每个字符都将以此形式进行百分比编码,该格式%xx作为cookie值有效.

所以,在创建cookie时:

Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
// ...
Run Code Online (Sandbox Code Playgroud)

在阅读cookie时,请执行以下操作:

String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
// ...
Run Code Online (Sandbox Code Playgroud)

另一种方法是通过切换到版本1 cookie Cookie#setVersion(),但IE <= 11不支持.