1、 问题描述
项目 B.A.com 二级域名下挂有三级域名C.B.A.com
为了使域名之间实现cookie共享,设置cookie domain 为.B.A.com
在老版本上该设计可行,但进行代码迁移后代码报错不可行
问题出在tomcat不同版本域名解析不同
2、问题分析
在tomcat8.5上是使用 org.apache.tomcat.util.http.Rfc6265CookieProcessor
在tomcat8.0上使用的是 org.apache.tomcat.util.http.LegacyCookieProcessor
Rfc6265CookieProcessor domain规则如下
1、必须是1-9、a-z、A-Z、. 、- (注意是-不是_)这几个字符组成
2、必须是数字或字母开头
3、必须是数字或字母结尾
于是“.B.A.com”写入不可行
3、问题解决
1、修改tomcat配置
编辑 Tomcat/conf/content.xml
增加配置在 context 中
CookieProcessor className=“org.apache.tomcat.util.http.LegacyCookieProcessor”
2、使用一级域名
1.现有如下三个域名:
顶级域名:A.com
二级域名:B.A.com
三级域名:C.B.A.com
2.访问顶级域名
访问顶级域名 A.com,设置如下四种情况的cookie
Y表示可以共享cookie,N表示无法共享
domain参数 | A.com | B.A.com | C.B.A.com | 备注 |
---|---|---|---|---|
setcookie(‘name’, time()+1) | Y | Y | Y | 默认设置当前访问的域名,即顶级域名 |
setcookie(‘name’, time()+1),’/’,‘A.com’ | Y | Y | Y | 设置顶级域名,全部共享 |
setcookie(‘name’, time()+1),’/’,‘B.A.com’ | N | N | N | |
setcookie(‘name’, time()+1),’/’,‘C.B.A.com’ | N | N | N |
3.访问二级域名
访问顶级域名 B.A.com,设置如下四种情况的cookie
Y表示可以共享cookie,N表示无法共享
domain参数 | A.com | B.A.com | C.B.A.com | 备注 |
---|---|---|---|---|
setcookie(‘name’, time()+1) | N | Y | Y | 默认设置当前访问的域名,即二级域名 |
setcookie(‘name’, time()+1),’/’,‘A.com’ | Y | Y | Y | 设置顶级域名,全部共享 |
setcookie(‘name’, time()+1),’/’,‘B.A.com’ | N | Y | Y | |
setcookie(‘name’, time()+1),’/’,‘C.B.A.com’ | N | N | N |
4.访问三级域名
访问顶级域名 B.A.com,设置如下四种情况的cookie
Y表示可以共享cookie,N表示无法共享
domain参数 | A.com | B.A.com | C.B.A.com | 备注 |
---|---|---|---|---|
setcookie(‘name’, time()+1) | N | N | Y | 默认设置当前访问的域名,即三级域名 |
setcookie(‘name’, time()+1),’/’,‘A.com’ | Y | Y | Y | 设置顶级域名,全部共享 |
setcookie(‘name’, time()+1),’/’,‘B.A.com’ | N | N | N | 设置二级域名,无法共享 |
setcookie(‘name’, time()+1),’/’,‘C.B.A.com’ | N | N | Y | 设置三级域名 |
5.总结
在setcookie中省略domain参数,那么domain默认为当前域名
domain参数可以设置父域名以及自身,但不能设置其它域名,包括子域名,否则cookie不起作用
如果cookie设置为顶级域名,则全部的域名,包括顶级域名、二级域名、三级域名等,都可以共享该cookie
如果cookie设置为当前域名,则当前域名及其下面的所有子域名可以共享该cookie
参考文章 https://blog.youkuaiyun.com/supermao1013/article/details/83827310