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

当前实现机制:
**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设置为失效状态,导致单设备登录实现失败!(同一用户,如果在登录操作时出现线程并发登录操作,则会显示被踢下线的提示!)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值