cookie中因domain设置引发的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/BThinker/article/details/89465533

                                               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

 

展开阅读全文

没有更多推荐了,返回首页