我有一个servlet应用程序,它将cookie存储为base64编码的字符串.在应用程序在ServletExec上运行的服务器上,cookie的值不包含在引号中.此外,如果值以'='字符结尾,则删除该字符.缺少的引号和尾随'='会阻止cookie的值被正确解析.在此应用程序运行的ServletExec和Tomcat上运行此应用程序的其他2台服务器中,cookie用双引号括起来,并且不删除尾随的"="符号.
如浏览器的开发人员工具所示:
坏 - cookiename:dGVzdHN0cmluZzE
预期 - cookiename:"dGVzdHN0cmluZzE ="
知道什么是剥离引号和尾随'='符号?TIA!
默认情况下,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不支持.
| 归档时间: |
|
| 查看次数: |
1934 次 |
| 最近记录: |