您的位置:首页 > 运维架构 > Tomcat

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.Cookie

publicstaticvoidparseCookie(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处理器的行为
如果需要。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航