servlet在同一域下jsession冲突问题现象记录

之前知道同一个ip或者域名下,会有session相互覆盖的问题,原因是cookie中的jsession会互相覆盖,可以通过在tomcat中修改jsessionid的cookie名称的方式解决。

今天在研究单点登录的时候突然想到,tomcat的webapps文件夹下可以随便扔war包,也就是说,tomcat是支持在同一个host下部署多个webapp程序的,这显然是在一个域中。根据经验,这样是完全可行的,因此与之前的结论有矛盾。

新建了个javaweb项目,名字叫webapp,放了一个session listener,在session create的时候打印一句日志。然后把这个项目复制了一份,名字改成webapp2。两个项目同时启动。

通过浏览器访问webapp,控制台中输出了开始session的信息。访问webapp2,控制台中也输出了开始session2的信息。按照我的预计,由于是同域,此时webapp的jsessionid cookie应该已经被覆盖了,再访问webapp应该开始一个新session。在浏览器中试了一下,发现控制台中没有打印信息。两个webapp随意交错刷新页面,都没有导致新建session。说明这个流程下,没有发生cookie互相覆盖的问题。

通过chrome查看cookie内容也印证了这一点,确实有两个不同的jsessionid,而且分别保持不变。跟之前得出的结论不符。

再仔细看了一下,发现chrome中的cookie显示界面中还有path这一项,说不行cookie不仅仅是跟域相关,还跟path相关。

于是把两个项目分别放在监听不同端口的两个tomcat中运行,但是项目的文件夹名字都改成webapp,再刷新,就开始发生cookie了。

具体现象是:

访问webapp页面,webapp启动一个session,cookie中增加一个jsessionid。

访问webapp2页面,webapp2启动一个session,cookie中增加jsessionid,由于在同一个域下,将webapp中的相应内容覆盖了。

访问webapp页面,此时浏览器提交的是webapp2的jsessionid,服务端找不到对应的session,于是又创建了session,重新在cookie中存放了jsessionid。

访问webapp2页面,类似于上一步,又创建了新的session。

大致结论:

同域的相同名称的webapp会共享cookie,不论是否在同一个端口下。(当然如果是两个不同的webapp,一定不在同一个端口下)

同域的不同名称的webapp不会共享cookie,不论是否在同一个端口下。

即:

192.168.0.100:8080/webapp1与192.168.0.100:8080/webapp2不共享jsessionid。

192.168.0.100:8080/webapp与192.168.0.100:8080/webapp共享jsessionid。