• tomcat下的Cookie特殊符号问题


    案例:
    在项目中通过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*<any CHAR except CTLs or tspecials>
    
          tspecials      = "(" | ")" | "<" | ">" | "@"
                         | "," | ";" | ":" | "" | <">
                         | "/" | "[" | "]" | "?" | "="
                         | "{" | "}" | SP | HT

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

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

    显然,相应特殊字符在Tomcat下不要在Cookie中使用,否则会导致Tomcat无法正确解析Cookie信息。
    而跟踪jetty源码发现,org.eclipse.jetty.server.CookieCutter方法parseFields()并不会把Cookie中的"@"作为特殊字符过滤掉。

    总结:
    虽然在jetty中侥幸可以使用特殊字符@作为Cookie值,但是建议在Cookie中不要使用任何特殊字符,否则应用程序的移植性太差。
    而且,对于存储的Cookie,最好进行编码处理。如通过escape()方法对Cookie进行编码:

    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与特殊字符

  • 相关阅读:
    centos中文乱码修改字符编码使用centos支持中文
    java知识总结-26
    java知识总结-25
    java知识总结-24
    java知识总结-23
    java知识总结-22
    java知识总结-21
    java知识总结-20
    java知识总结-19
    java知识总结-18
  • 原文地址:https://www.cnblogs.com/nuccch/p/6761366.html
Copyright © 2020-2023  润新知