单设备登录遇到并发出现的问题

来源:互联网 发布:js的缺点 编辑:程序博客网 时间:2024/06/06 06:01

当前实现机制:
1.用户登录时,在session里放入一个标识,isInvalid=0代表此session有效。并且,在服务器缓存中,放入userCode=sessionId键值对。
2.当该用户其他设备再次登录时,先去缓存中获取userCode对应的sessionId,如果为空,即为此用户是首次登录;如果不为空,则比较此次登录用户与缓存中保存的sessionId是否为同一个,若是,则是同一设备用户;不是,则是其他设备用户登录。
此时,需要在缓存中记录的sessionId对应的session中放入isInvalid=1,代表此session已经失效。
3.过滤器中则去校验每一个session中的isInvalid的值,如果是失效的:则转发该请求到登出页面,然后给app或者h5页面发送消息,提示该用户账号被其他设备踢下线!
备注:如果过滤器检测到session里面没有user对象,则会自动进行登录操作。

现实:
用户偶尔会被踢下线,并且确定没有其他用户把它给踢掉!本地进行复现,也没有复现出来!

最后,在一次非常偶然的调测,发现了打印的日志有蹊跷:
这里写图片描述

如图,可以看到一个sessionId刚登陆,就被其他session的用户(其实是同一设备的同一个用户,因为userCode是唯一的)给踢下线。并且在打印“是否支持单设备登录”信息的时候共有四个线程同时访问,导致其中一个线程在登录的时候,另一个线程也进行的登录操作,然后把前一个session设置为失效状态,导致单设备登录实现失败!(同一用户,如果在登录操作时出现线程并发登录操作,则会显示被踢下线的提示!)

待续————
后续开发,打算使用用户设备串号进行核对,如果串号不一致再进行踢下线操作!