前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tomcat下的Cookie特殊符号问题

tomcat下的Cookie特殊符号问题

作者头像
编程随笔
发布2019-09-11 15:35:59
1.2K0
发布2019-09-11 15:35:59
举报
文章被收录于专栏:后端开发随笔后端开发随笔

案例: 在项目中通过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):

代码语言:javascript
复制
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*<any CHAR except CTLs or tspecials>

      tspecials      = "(" | ")" | "<" | ">" | "@"
                     | "," | ";" | ":" | "\" | <">
                     | "/" | "[" | "]" | "?" | "="
                     | "{" | "}" | SP | HT

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

代码语言:javascript
复制
class RFC6265Validator extends CookieNameValidator {
    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进行编码:

代码语言:javascript
复制
function setCookie(c_name,value,expiredays) {
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + expiredays);
    document.cookie=c_name + "=" + escape(value)+ ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
}

【参考】 https://en.wikipedia.org/wiki/HTTP_cookie https://tools.ietf.org/html/rfc2109 https://tools.ietf.org/html/rfc2965 https://tools.ietf.org/html/rfc6265 http://www.blogjava.net/stone2083/archive/2010/11/03/336923.html 关于cookie特殊字符的一点理解 https://www.biaodianfu.com/cookie-symbol.html Cookie与特殊字符

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档