问题描述
使用tomcat部署服务后,点击F12,通过浏览器发现cookie中的path值(/)被加上双引号。
临时解决
通过百度,找到了临时的解决方案,链接如下:
https://blog.youkuaiyun.com/uniquewonderq/article/details/88421737
问题分析
但是为什么需要设置这个参数呢?
1. 之前的tomcat版本(7.0.90)和这次的版本(7.0.91)之间在cookie的实现上应该没有什么大的修改。
2. web应用前后使用的是同一套代码,说明不是web应用的问题。
3. 查询tomcat配置,发现多了一个配置(org.apache.catalina. STRICT_SERVLET_COMPLIANCE = true) ,查询tomcat官网,发现设置该参数后会导致web应用出现一些问题,如下:
且设置该参数后,会导致如下的参数也被设置为true(这里只关注与cookie有关的参数)。
源码分析
看参数描述不是很懂这个参数的具体影响,为什么会导致path的“/”被加上了双引号,于是去看了tomcat对cookie值设置的相关实现。如下是ServerCookie的appendCookieValue方法:
Cookie初始化时默认version = 0,ALLOW_HTTP_SEPARATORS_IN_V0默认为false,此时查看CookieSupport.isHttpToken()方法的相关实现,其中返回值是通过CookieSupport类的static块确定的,如下所示:
如果没有设置FWD_SLASH_IS_SEPARATOR 的值,该参数将会与org.apache.catalina. STRICT_SERVLET_COMPLIANCE 属性的值一致。
如上图所示,当FWD_SLASH_IS_SEPARATOR属性被设置为true后,“/”就被确定为分隔符,从而导致此时的cookie默认为version 1。如下,此时在判断是否需要加双引号时,满足isHttpToken为true且ALLOW_HTTP_SEPARATORS_IN_V0默认为false,此时就会给“/”加上双引号了。
解决方案
1.将org.apache.catalina. STRICT_SERVLET_COMPLIANCE 属性设置为false,tomcat默认也是为false。
2.如果需要强行将org.apache.catalina. STRICT_SERVLET_COMPLIANCE 属性设置为true,则可以在catalina.properties文件中,将ALLOW_HTTP_SEPARATORS_IN_V0属性为true。
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true