目录
前言
所谓踢人下线,核心操作就是找到指定 loginId
对应的 Token
,并设置其失效。
上图为踢人下线后,前端应该用图像给出来让用户重新登录,而不是让前端收到一个描述着被下线
的JSON
强制注销
StpUtil.logout(10001); // 强制指定账号注销下线
StpUtil.logout(10001, "PC"); // 强制指定账号指定端注销下线
StpUtil.logoutByTokenValue("token"); // 强制指定 Token 注销下线
踢人下线
StpUtil.kickout(10001); // 将指定账号踢下线
StpUtil.kickout(10001, "PC"); // 将指定账号指定端踢下线
StpUtil.kickoutByTokenValue("token"); // 将指定 Token 踢下线
强制注销 和 踢人下线 的区别在于:
强制注销等价于对方主动调用了注销方法,再次访问会提示:Token无效。
踢人下线不会清除Token信息,而是将其打上特定标记,再次访问会提示:Token已被踢下线。
源码解析
StpUtils.kickout根据loginId踢人下线,StpUtils调用StpLogic进行踢人下线。
获取SaTokenConfig配置类,构建SaLogoutParameter对象,例如:注销范围、如果token已被
冻结是否保留操作、注销token是否保留对应Token-Session。
logoutParameter设置注销类型为踢人下线。
根据sessionId从SaTokenDao获取SaSession,SaTokenDao从IOC里面获取,如果获取不到就使
用默认的SaTokenDaoDefaultImpl(),默认将数据存储在内存,存储在内存使用ConcurrentHashMap
中,一般我们会实现SaToKen接口,重写里面方法,将数据存储在Redis中,sa-token有集成了
Redis,我们导入sa-token-redis-template依赖即可。
获取登录设备终端信息,如果设备类型为空,则返回所有终端设备。
从Account-Session上清楚此设备信息,移除设备相关信息并且更新Session。
清楚这个token的Token-Session对象,删除指定token的Token-Session。
根据注销模式走不同处理,踢人下线更新缓存中的token指向,改为-5。最后发布订阅时间:xxx账
号被踢下线。
最后判断一下这个Account-Session还有没有客户端登录,如果没有直接注销这个Account-
Session。