场景:
部署了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:
接入市面上已有的会话一致性组件
网友评论