java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie

当项目中使用单点登录功能时,通常会使用cookie进行信息的保存,这样就可以在多个子域名上存取用户信息。
比如有三个domain分别为test.com,cml.test.com,b.test.com这三个域名下的cookie是需要互相访问的。这时会在response上写入cookie信息

        Cookie cookie = new Cookie("testCookie", "test");
        cookie.setDomain(".test.com");
        cookie.setPath("/");
        cookie.setMaxAge(36000);
        resp.addCookie(cookie);

这样写在tomcat8.0上是没问题的,三个域名可以共享cookie信息。但是把它放到tomcat8.5上就报错了

java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie
        at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:181)
        at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:123)
        at org.apache.catalina.connector.Response.generateCookieString(Response.java:989)
        at org.apache.catalina.connector.Response.addCookie(Response.java:937)
        at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)
        at com.cml.mvc.controller.HelloWorld.str(HelloWorld.java:98)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)

在tomcat8.5上是使用org.apache.tomcat.util.http.Rfc6265CookieProcessor

The standard implementation of CookieProcessor is org.apache.tomcat.util.http.Rfc6265CookieProcessor.

This cookie processor is based on RFC6265 with the following changes to support better interoperability:

Values 0x80 to 0xFF are permitted in cookie-octet to support the use of UTF-8 in cookie values as used by HTML 5.
For cookies without a value, the '=' is not required after the name as some browsers do not sent it.
The RFC 6265 cookie processor is generally more lenient than the legacy cookie parser. In particular:

The '=' and '/' characters are always permitted in a cookie value.
Name only cookies are always permitted.
The cookie header is always preserved.
No additional attributes are supported by the RFC 6265 Cookie Processor.

文档地址

在tomcat8.0上使用的是org.apache.tomcat.util.http.LegacyCookieProcessor

The standard implementation of CookieProcessor is org.apache.tomcat.util.http.LegacyCookieProcessor. Note that it is anticipated that this will change to org.apache.tomcat.util.http.Rfc6265CookieProcessor in a future Tomcat 8 release.

This is the legacy cookie parser based on RFC6265, RFC2109 and RFC2616. It implements a strict interpretation of the cookie specifications. Due to various interoperability issues with browsers not all strict behaviours are enabled by default and additional options are available to further relax the behaviour of this cookie processor if required.

文档地址

问题就可以定位在CookieProcessor不同实现引起的。
原因分析见下半篇博客:An invalid domain [.test.com] was specified for this cookie 原因分析


解决方法:

  1. 指定完整的domain信息,但是这样单点登录就会有问题了
        Cookie cookie = new Cookie("testCookie", "test");
        cookie.setDomain("cml.test.com");
        cookie.setPath("/");
        cookie.setMaxAge(36000);
        resp.addCookie(cookie);

2.设置为一级域名(推荐)

        Cookie cookie = new Cookie("testCookie", "test");
        cookie.setDomain("test.com");
        cookie.setPath("/");
        cookie.setMaxAge(36000);
        resp.addCookie(cookie);

域名问题参考文章:顶级域名和二级域名共享cookie及相互删除cookie

转载于:https://www.cnblogs.com/cmlblog/p/7663111.html

An invalid domain [] was specified for this cookie问题解决方案 An invalid domain [] was specified for this cookie问题解决方案 1.【问题描述】: 项目运行在Tomcat 8.5.30上启动报出An invalid domain [] was specified for this cookie,报错行:在某个filter中设置顶层域名cookie​​​​​​​,原因:该Tomcat版本下域名验证的时候错误... 阅读详情

相关推荐

java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie解决方法...

当项目中使用单点登录功能时,通常会使用cookie进行信息的保存,这样就可以在多个子域名上存取用户信息。 比如有三个domain分别为test.com,cml.test.com,b.test.com这三个域名下的cookie是需要互相访问的。这时会在response上写入cookie信息 Cookie cookie = new Cookie("testCookie", "test...

weixin_30872671的博客 421

java.lang.IllegalArgumentException: An invalid domain [.xxx.com] was specified for this cookie

java.lang.IllegalArgumentException: An invalid domain [.xxx.com] was specified for this cookie at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:...

weixin_44773418的博客 3279

An invalid domain [] was specified for this cookie问题解决

在tomcat8.0升级到8.5时会发生这样的问题 java.lang.IllegalArgumentException: An invalid domain [.tencent.xxx.com] was specified for this cookie at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:203) at org.

【欢迎关注公众号:冬瓜白】 3539

An invalid domain [.test.com] was specified for this cookie 原因分析

java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie 以上博客说明了解决办法以及可能的原因,现在就根据log查看tomcat源码看看是异常的原因以及在tomcat8.5上cookie name的规则。 Rfc626...

aaronyan1990的博客 573

java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie解决方法

java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie解决方法

Littleree的博客 523

tomcat 8.5 及其 9.0 response写cookie 设置damain为 [.test.com] 出错 An invalid domain [.test.com] was specif...

抛出异常: java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cookie 参考博客: https://www.cnblogs.com/cmlblog/p/7663111.html 解决方法 1、设置为一级域名 test.com前面不加 . ...

aijian9025的博客 316

计算机网络 —— 在域名和子域名之间共享 cookie

Share cookie between subdomain and domain https://stackoverflow.com/questions/18492576/share-cookie-between-subdomain-and-domain?rq=1 java.lang.IllegalArgumentException: An invalid domain [.test.c

HeatDeath的博客 1021

java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

在重构项目的时候,遇到了mybatis的一个异常: java.lang.IllegalArgumentException:invalidcomparison:java.util.Dateandjava.lang.String 随后在网上查询解决方法时看到,这个是mybatis在3.3.0版本修复的一个bug,3.3.0之前是没有问题,之后就会报异常。 原因是:...

weixin_30599769的博客 152

invalid comparison: com.alibaba.fastjson.JSONArray and java.lang.String

错误原因:在mybatis xml文件中的动态sql,if test 非空判断类型出错,把JSONArray与空串作比较,代码片段如下: **错误原因:**在mybatis xml文件中的动态sql,if test 非空判断类型出错,把JSONArray与空串作比较,代码片段如下: <if test="list != null and list !=''">...

菇凉,不骄不躁 1808

Java数组越界异常深度解析:从原理到根治方案

数组是编程中最基础的数据结构之一,它通过连续内存空间存储相同类型的数据元素,并通过索引进行高效访问。其核心原理在于,JVM会在运行时对每次数组访问执行边界检查,确保索引值在有效范围内(0到长度-1),这是保障内存安全、防止程序访问非法内存区域的关键机制。理解这一机制的技术价值在于,它不仅是编写健壮代码的基础,更是深入理解Java内存模型、集合框架底层实现(如ArrayList)乃至缓冲区溢出等安全概念的入口。在实际应用场景中,无论是简单的数据遍历、复杂的业务逻辑计算,还是高并发的多线程环境,不当的索引操作都

weixin_30908941的博客 438

Java枚举深度解析:从类型安全到高级应用实践

Java编程中,类型安全是保证代码健壮性的重要基础。枚举作为一种特殊的类,通过限定变量的取值范围,从根本上解决了传统常量定义中存在的类型不安全问题。其原理在于编译后继承java.lang.Enum,每个枚举常量都是该类的单例实例,确保了唯一性和线程安全性。这一特性不仅提升了代码的可读性和可维护性,还使得枚举能够与集合框架高效协作,例如通过EnumSet和EnumMap实现高性能的数据存储与访问。在实际应用场景中,枚举常被用于状态管理、策略模式实现以及配置项定义,特别是在领域驱动设计中作为值对象的理想载体。

weixin_30325487的博客 392

Java设计模式---动态代理原理源码分析

本文深入分析了Java动态代理的实现原理,主要解答了三个核心问题:1)代理类的生成位置和方式;2)TimeHandler类的作用;3)调用流程如何跳转到invoke方法。通过解析Proxy.newProxyInstance源码,揭示了代理类是通过字节码动态生成并加载的,继承Proxy类并实现指定接口。生成的代理类将接口方法调用转发给InvocationHandler的invoke方法,其中TimeHandler作为参数传入。文章还介绍了如何保存和查看生成的代理类文件,并通过反编译代码展示了代理类的具体实现,

ywl470812087的博客 11万+

Java枚举类深度解析与高级应用实战

枚举(Enum)是Java中一种特殊的类类型,它通过有限的命名实例来实现类型安全的常量集合。从JVM层面看,每个枚举常量都是单例对象,这种设计既保证了线程安全又提供了良好的可扩展性。在工程实践中,枚举常用于状态机、策略模式、配置管理等场景,能显著提升代码的可读性和可维护性。Java枚举支持添加字段、方法和构造器,还能实现接口,这使得它在实现设计模式时比传统方式更简洁高效。通过EnumSet和EnumMap这两个专门优化的集合类,开发者可以充分发挥枚举的性能优势。在Spring框架、JPA持久层等主流技术中,

weixin_33910385的博客 500

Android Google XTS

GMS全称为Google Mobile Service,即谷歌移动服务。GMS是Google开发并推动Android的动力,是Google提供的Mobile Device上的一系列应用服务。

qq_27672101的博客 1780

Java深入解析篇七之异常处理

Java 中所有异常和错误的根类是 ,它有两个直接子类: 和 。 1.2 Throwable 核心方法 1.3 Throwable 构造器 二、Checked Exception vs Unchecked Exception 2.1 核心区别 特性 Checked Exception Unchecked Exception 继承关系 Exception 的非 RuntimeException 子类 RuntimeException 及其子类 编译期检查 必须捕获或声明抛出 无强制要

萧瑟余晖的博客 295
上一篇: Universalimageloader 原图片大小获取
下一篇: An invalid domain [.test.com] was specified for this cookie 原因分析
aaronyan1990
博客等级 码龄10年 0粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值