通过请求分发到多台web容器实例,会话状态不能正确识别的解决方案

2022-01-07  本文已影响0人  lonmao

场景:
部署了2台以上的web实例,用户请求到Nginx,通过一定的规则分发到实例上,直接鉴权就会导致用户的登录请求去到了实例A,后续请求去到实例B,但是B这边没有回话状态信息,就会认为该用户未登录。

原因:
原因是实例A认证登录通过后,会话信息没有同步到其余实例导致的,即其他实例拿不到信息自然会认为未登录。

方案:
既然原因的登录的会话信息未同步导致的,那么同步即可。

方案1:
通过登录逻辑后,将登录信息放在cookie中(比如一个变量isLogin),后续请求从cookie中获取前述信息,从而判断登录状态。
优势:方便快速,开发成本低
缺陷:安全性低,如果知道你的变量和逻辑,有可能被伪造登录数据。

方案2:
在cookie中维护一个类似sessionId的东西,用户登录后,set sessionId,然后将这个id作为key,这样关于这个会话相关的信息都可以维护在key对应的value中,除了登录态,其他公共信息也可以,至于这个数据是放在codis还是sql中就看业务抉择了;当用户退出登录,可以干掉这个key-value,也可以直接在cookie中set sessionId=null

优势:
安全性高,通过一个id来绑定用户当前会话状态,可以多个实例共享会话数据;
自己实现的逻辑,利于后期迭代维护;
除了登录状态,还能存储公共的用户会话信息;

缺陷:
需要自己实现,复杂度稍高;
多实例共享数据会有额外开销;

方案3:
接入市面上已有的会话一致性组件

上一篇 下一篇

猜你喜欢

热点阅读