一个默认cookie处理器引发的问题

本文探讨了在升级JDK到1.8.0u192时,预发环境中遇到的顶层域名cookie错误,涉及Rfc6265CookieProcessor和LegacyCookieProcessor的选择,提供了修改配置、降低版本或调整代码的解决办法,强调了版本升级中的注意事项。

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

        最近对系统进行jdk升级的过程中,其中一个预发环境在设置顶层域名cookie时出现了如下的错误,这里tomcat版本为:8.5.42, jdk版本为1.8.0u192。

java.lang.IllegalArgumentException: An invalid domain [.XXXX] was specified for this cookie
at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:210)
at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:145)
at org.apache.catalina.connector.Response.generateCookieString(Response.java:983)
at org.apache.catalina.connector.Response.addCookie(Response.java:931)
at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)

查看对应的代码

从上面的源码中可以看到,在这个版本中有效的domain的不支持以dot开头了

根本原因

        发现这个generateHeader方法中有两个实现,查看源码可知,tomcat8.5版本默认使用的是Rfc6265CookieProcessor实现的,它是基于RFC6265的。

 而在低版本,如tomcat8.0.50中, 默认为LegacyCookieProcessor,这是基于 RFC6265、RFC2109 和 RFC2616 的遗留 cookie 解析器,由于与浏览器的各种互操作性问题,并非所有严格行为都默认启用。

目前官网中有关于这两个cookie解析器的对比,再此就不再细述(https://tomcat.apache.org/tomcat-8.5-doc/config/cookie-processor.html)。

解决方案 

1、指定cookie处理器,对于独立的tomcat,修改配置文件context.xml,指定CookieProcessor为LegacyCookieProcessor即可,对于springboot内嵌tomcat,在springboot启动中增加内嵌tomcat的配置即可。

2、降低tomcat的版本。

3、更改代码,使cookie满足RFC6265标准。

虽然这是一个简单的问题,但还是有所启示,无论是进行中间件升级,还是其他版本的升级,都是一件严谨而神圣事情,对于我们研发来说停下来思考一会儿也是一件好事,看看窗外的风景。

### 后置处理器清除Cookie的实现 在Spring MVC框架中,可以通过自定义`HandlerInterceptor`来处理请求和响应中的特定操作。为了实现在后置处理器中清除Cookie的功能,可以利用`afterCompletion()`方法,在该方法内通过HttpServletResponse对象设置Cookie的有效期为0从而达到删除的效果。 以下是具体实现代码: ```java import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CookieClearingInterceptor implements HandlerInterceptor { private String cookieName; public void setCookieName(String cookieName) { this.cookieName = cookieName; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 清除指定名称的Cookie clearCookie(response); } private void clearCookie(HttpServletResponse response) { Cookie cookie = new Cookie(cookieName, null); cookie.setMaxAge(0); // 设置最大存活时间为0秒表示立即过期 cookie.setPath("/"); // 需要与创建时路径一致,默认根目录"/" response.addCookie(cookie); } } ``` 此拦截器会在每次HTTP请求完成后执行,并尝试移除名为`cookieName`的Cookie[^1]。需要注意的是,当配置此类拦截器时应确保正确设置了目标Cookie的名字以及其对应的上下文路径。 对于更复杂的场景,比如跨域应用或HTTPS环境下的安全Cookies,还需要额外考虑其他属性如domain、secure等参数的设定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值