tomcat session引出的问题
这次碰到一个奇怪的问题,为测试要求,将同一个应用A部署到两个端口的tomcat中,访问地址如下:
结果单独打开一个没问题,同时打开两个就都运行不了。
查看服务端日志,认定是session过期。
从客户端看,发现这两个A应用的sessionid交替变换!
这才明白,由于session是基于cookie的,cookie按照domain+path来找,是不区分端口号的!所以两个应用的sessionid冲突了!
所以流程就变成了这样:
浏览器请求10001 A-->服务端 java:getSession()->创建cookie[name=sessionid,domain=localhost,path=A,value=c1]
浏览器请求10002 A-->服务端 java:getSession()->创建cookie[name=sessionid,domain=localhost,path=A,value=c2]
浏览器请求10001 A,在http请求头中请求发送cookie[sessionid=c2](这里就冲突了,sessionid被10002 A改了)->服务端 java:getSession()(使用name=c2找不到,于是创建新的)->创建cookie[name=sessionid,domain=localhost,path=A,value=c3]
浏览器请求10002 A,在http请求头中请求发送cookie[sessionid=c3](这里又冲突了,sessionid被10001 A改了)->服务端 java:getSession()(使用name=c3找不到,于是创建新的)->创建cookie[name=sessionid,domain=localhost,path=A,value=c4]
周而复始的互相刷sessionid,两个服务器就在那不停地清过期session,又创建新的session。
这种情况在web应用中一般不会出现,但是在内部测试环境中可能出现!