公司有两个浏览器的应用,都部署的同一服务器的不同端口上。后发现,我同时登陆两个系统,然后退出其中一个,另一个也会跟着被退出。我猜测应该是cookie或者session的问题,于是试着修改cookie中两个应用相同的字段名,修改拦截器中的验证字段。但是都没有效果,后来再网上找到一篇处理此问题类似的博文,于是照着方法做了调整成功处理。于是在此做下记录。
一、分析问题(本人比较菜,如有不对的地方请指正):
由于http连接是无状态的,所以我们需要一个独一无二的标识来标志每个用户的登录状态,这样就能在跳转页面的时候,继续处理该用户的数据了。而这个东西就是session了。session是存储在服务器中的。每次用户连接上系统时,服务器就会给该用户分配一个独一无二的session_id,用于标识该用户(一般会设置session过期时间,或者用户主动退出,不然内存一直不释放,会导致内存泄露)。
接下来我们来分析一下产生这个问题的流程。首先我们在A应用中登录,这时候服务器给分配了一个唯一的session_id_01,服务器接着把session_id_01以"MASSESSION"这个字段名封装在cookie中(被框架二次封装过,名称可能与其他框架不一样),用于浏览器下一次请求时做检验。这时候,我们再登录B应用中,服务器同样分配了一个唯一的session_id_02,同样服务器还是接着session_id_02以"MASSESSION"这个字段名封装在cookie中,然后返回给浏览器。问题就出在这里,由于是同一域名,所以第二次的cookie中的"MASSESSION"会把第一次的给覆盖掉。接下来在B应用中我们选择退出。这时候服务器就会将session_id_02,给清除了。然后我们再去操作A应用,这时候的A应用中的cookie中的"MASSESSION"已经是被B应用中的"MASSESSION"覆盖过的。这时候,我们在A应用中操作时,会把session_id_02对应的"MASSESSION"给传回服务器。这时候,服务器的session_id_02对应的"MASSESSION"已经被清除了,必然是无法完成校验的,这时候就会被踢出A应用。
ps:浏览器的cookie有一个domain属性,该属性保存着这个cookie是哪个服务器使用的(根据域名区分),这样当浏览器去请求不同服务器就可以选择合适的cookie带到后台了.
二、处理方法:
给cookie设置参数的时候,给cookie取不同的名称,让服务器做区分。这样就能解决这个问题了。
原文地址:https://www.cnblogs.com/Nick-Hu/p/10846138.html