怎么保证一个账号同时只被一个人登录?(解决方案以及思考过程和代码)
今天解决了一个问题,也就是保证账号登录状态下的唯一性,在此分享下思考过程和解决问题的思路吧
首先,明确问题,一个账号只能同时被一个人登录
实现很简单,在服务器记录用户的状态即可,这个我们通过Map把用户id和登录状态进行映射确实可以记录用户登录状态.但是紧接着问题来了,
第一个问题,我们怎么知道登录的是哪个用户?
解决:使用session保存用户信息即可,继续延伸出下一个问题,在哪里记录用户登录的状态?
1:登录的地方,将用户状态设置为登录
2:注销的地方,将用户状态设置为下线
3:session失效,首先监听session,当用户长时间不使用的时候,会触发监听函数,拿到用户信息,将登录状态设置为下线
OK,继续提出问题:我们保存用户sessionId的Cookie没有设置生命周期,也就是15分钟+临时会话状态,也就是关闭浏览器后马上会被销毁,此时session也拿不到了,而这个时候如果用户再登录会发现他登录不上去,
因为现在出现的情况不在上面两个会销毁session情况的任何一个中,此时用户状态就仍然为在线状态.
解决:将cookie和session在拦截器处每次都重置为20分钟即可
继续问题:虽然用户关闭浏览器后拿不到之前的session的问题解决了,但是如果用户手动清空浏览器内存呢?此时cookie仍然会被销毁,我们的用户在线状态可能仍然是在线
解决:再添加一个用户最后操作时间即可,每次经过拦截器都会被刷新,并且最后操作时间与当前时间之间的间隔要大于20分钟才会被拦截器判断是否是在线状态,这样的话如果用户在登录后20分钟内就算清空浏览器内存,也不会因为账号依然
处于在线状态而被拦截,而大于20分钟的话session肯定已经被销毁了,我们的监听器也就是第三种情况就起作用了.
所有流程思考时间大概三分钟便搞定了
最后,如果你的项目是分布式的,只需要做好Session共享以及Cookie跨域,并将用户Id与登陆状态的映射放到Redis中即可.
代码如图: