Tomcat:A cookie header was received[xxxxxx] that contained an invalid cookie. That cookie will be ignored.
2017-09-24 14:30
706 查看
搬运来源:https://blogs.yahoo.co.jp/dk521123/36721868.html
原因:
*从Tomcat8,Cookie的解析已经符合RFC6265。 *由于RFC6265不再接受以前允许的逗号分隔符(例如RFC2109) "Cookie:KEY1=VAL1,KEY2=VAL2"的格式被视为非法
发生过程:
*客户端(Java) | HTTPS ↓ 负载均衡器/粘性会话 | HTTP ↓ *Apache(v2.4.6)*也发生在2.2.31版本中 | AJP1.3 ↓ *Tomcat(v8.5.11) ↓ *Web服务(Java)
RFC2109
Cookie标头中的分隔符在任何地方都是分号(;)。 #Cookie标头中的分隔符是分号(;)无处不在 服务器还应该接受逗号(,)作为cookie值之间的分隔符,以便将来兼容。 #服务器应该接受逗号和分隔符以向后兼容cookie值。 ⇒换句话说,RFC2109中的"Cookie:KEY1=VAL1,KEY2=VAL2"正常
RFC6265
cookie-header="Cookie:"OWScookie-stringOWS cookie-string=cookie-pair*(";"SPcookie对) #没有具体使用逗号作为分隔符的描述
摘自Tomcat源码
org.apache.tomcat.util.http.parser.CookiepublicstaticvoidparseCookie(byte[]bytes,intoffset,intlen, ServerCookiesserverCookies){ //・・・略・・・ //UsingRFC6265parsingrules,checktoseeiftheheaderstartswitha //versionmarker.AnRFC2109versionmarkermaybereadusingRFC6265 //parsingrules.Ifversion1,useRFC2109.ElseuseRFC6265. skipLWS(bb); //・・・略・・・ if(skipResult!=SkipResult.FOUND){ //NoneedtoresetpositionsinceskipConstant()willhavedoneit parseCookieRfc6265(bb,serverCookies); return; }
解决方法:
旧版中,修改${catalina.home}/conf/server.xml如下<CookieProcessorclassName="org.apache.tomcat.util.http.LegacyCookieProcessor"/> </Context>
Tomcat8/9修改context.xml如下
<CookieProcessorclassName="org.apache.tomcat.util.http.LegacyCookieProcessor"/> </Context>
参考资料:
https://tomcat.apache.org/tomcat-8.5-doc/config/cookie-processor.html更多摘录
传统Cookie处理器-org.apache.tomcat.util.http.LegacyCookieProcessor 这是基于RFC6265,RFC2109和RFC2616的遗留cookie解析器。 它实现了对cookie规范的严格解释。 由于浏览器的各种互操作性问题,并不是所有严格的行为都被启用 默认情况下,还有其他选项可用于进一步放松此cookie处理器的行为 如果需要。