Tomcat之cookie中的双引号

在使用Tomcat 7.0.91版本时发现,cookie的path值被加上了双引号。这并非代码问题,而是由于设置了org.apache.catalina.STRICT_SERVLET_COMPLIANCE为true导致。此设置会使得FWD_SLASH_IS_SEPARATOR属性变为true,将“/”视为HTTP分隔符,使得cookie遵循version 1标准,对于version 0的cookie,不允许HTTP分隔符,因此添加了双引号。解决方案是将STRICT_SERVLET_COMPLIANCE设回false,或者将ALLOW_HTTP_SEPARATORS_IN_V0设为true。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值