9.两个应用部署在同一个服务器中,处理串用session_id的问题(如果设置了拦截器,其中一个应用退出后,另一个也会被退出)

Posted nick-hu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.两个应用部署在同一个服务器中,处理串用session_id的问题(如果设置了拦截器,其中一个应用退出后,另一个也会被退出)相关的知识,希望对你有一定的参考价值。

公司有两个浏览器的应用,都部署的同一服务器的不同端口上。后发现,我同时登陆两个系统,然后退出其中一个,另一个也会跟着被退出。我猜测应该是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取不同的名称,让服务器做区分。这样就能解决这个问题了。

  技术图片

以上是关于9.两个应用部署在同一个服务器中,处理串用session_id的问题(如果设置了拦截器,其中一个应用退出后,另一个也会被退出)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Session + Redis实现分布式Session共享

通过单独运行批处理微服务在 Spring Cloud Data Flow 上部署 Spring Batch 应用程序

部署 Angular 9 应用程序

Java应用集群下的定时任务处理方案(mysql)

VC++多线程问题

在 C 客户端/服务器应用程序上重用 SSL 会话