java cookie 特殊字符_tomcat下的Cookie特殊符号问题

09207aabc047c866572f0d7ed057b4bf.png

案例:

在项目中通过Cookie方式临时存放检索条件,不小心在Cookie值中使用了特殊符号"@",导致在服务器端无法正确解析Cookie值。

之所以说"不小心",根本原因是对于Cookie的理解不够深入。

实际上在开发环境使用run-jetty-run插件进行调试时并未发现问题,经验证:

在jetty下可以在Cookie中使用特殊符号@,但是在Tomcat下不能在Cookie中使用特殊符号@。

Cookie规范经历了多个版本发展,分别是: RFC 2109(1997年),RFC 2965(2000年), RFC 6265(2011年)。

Cookie值的约定见rfc2068描述(https://tools.ietf.org/html/rfc2068):

Many HTTP/1.1 header field values consist of words separated by LWS

or special characters. These special characters MUST be in a quoted

string to be used within a parameter value.

token = 1*

tspecials = "(" | ")" | "" | "@"

| "," | ";" | ":" | "\" |

| "/" | "[" | "]" | "?" | "="

| "{" | "}" | SP | HT

对应的,在Tomcat实现中javax.servlet.http.Cookie对特殊字符的定义如下:

class RFC6265Validator extendsCookieNameValidator {private static final String RFC2616_SEPARATORS = "()<>@,;:\\\"/[]?={} \t";

RFC6265Validator() {super(RFC2616_SEPARATORS);

}

}

显然,相应特殊字符在Tomcat下不要在Cookie中使用,否则会导致Tomcat无法正确解析Cookie信息。

而跟踪jetty源码发现,org.eclipse.jetty.server.CookieCutter方法parseFields()并不会把Cookie中的"@"作为特殊字符过滤掉。

总结:

虽然在jetty中侥幸可以使用特殊字符@作为Cookie值,但是建议在Cookie中不要使用任何特殊字符,否则应用程序的移植性太差。

而且,对于存储的Cookie,最好进行编码处理。如通过escape()方法对Cookie进行编码:

functionsetCookie(c_name,value,expiredays) {var exdate = newDate();

exdate.setDate(exdate.getDate()+expiredays);

document.cookie=c_name + "=" + escape(value)+ ((expiredays == null) ? "" : ";expires=" +exdate.toGMTString());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值