cookie中因domain设置引发的问题
场景:项目采用springboot构建,为了解决tomcat分布式的问题,采用根域名进行配置,session共享问题中,创建自定义的CookieUtil类,实现读,写,删除cookie的操作,部分代码如下
private final static String COOKIE_DOMAIN = ".stormstudio.top";
private final static String COOKIE_NAME = "cbt_token";
//X:domain=".happymmall.com"
//a:A.happymmall.com cookie:domain=A.happymmall.com;path="/"
//b:B.happymmall.com cookie:domain=B.happymmall.com;path="/"
//c:A.happymmall.com/test/cc cookie:domain=A.happymmall.com;path="/test/cc"
//d:A.happymmall.com/test/dd cookie:domain=A.happymmall.com;path="/test/dd"
//e:A.happymmall.com/test cookie:domain=A.happymmall.com;path="/test"
public static void writeLoginToken(HttpServletResponse response,String token){
Cookie ck = new Cookie(COOKIE_NAME,token);
ck.setDomain(COOKIE_DOMAIN);
ck.setPath("/");//代表设置在根目录
ck.setHttpOnly(true);
//单位是秒。
//如果这个maxage不设置的话,cookie就不会写入硬盘,而是写在内存。只在当前页面有效。
ck.setMaxAge(60 * 60 * 24 * 365);//如果是-1,代表永久
response.addCookie(ck);
}
springboot解决这个内置的tomcat问题,对cookie的处理的cookieConfig类
在本地调试以及运行是没有问题的,但是没有想到部署到线上出现:
java.lang.IllegalArgumentException: An invalid domain [.stormstudio.top] was specified for this cookie
at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:203)
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)
at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:58)
at com.szcbt.finance.web.utils.cookie.CookieUtil.writeLoginToken(CookieUtil.java:51)
at com.szcbt.finance.web.controller.user.common.UserLoginController.login(UserLoginController.java:277)
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:498)
关键字处的异常信息:
java.lang.IllegalArgumentException: An invalid domain [.stormstudio.top] was specified for this cookie
解决方式:
设置的COOKIE_DOMAIN的值为“stormstudio.top”,在一级域名前有一个点,把这个点去除掉。
线上采用的tomcat版本:apache-tomcat-8.5.40.tar.gz,这个是tomcat版本的问题导致的。
那采用tomcat的8.5以下的版本会不会出问题,经过测试发现,是没有问题的。
那来深入看一下这个是什么问题?看tomcat的版本处理情况。
查看tomcat8.5的版本源码,可以看到Rfc6265CookieProcessor中的validateDomain对domain的处理,关键代码贴出
domain规则如下
1、必须是1-9、a-z、A-Z、. 、- (注意是-不是_)这几个字符组成
2、必须是数字或字母开头(开头加点是出错的,如".stormstudio.top")
2、必须是数字或字母结尾
path的规则源码及规则
1、字符必须是在 0x20-0x7E之间,并且不能出现”;”号
cookie value 源码及规则
1、会自动去除开头和结尾的引号”
2、如果包含以下规则字符则校验失败:
c < 0x21 || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f