目錄
前言
強制注銷
踢人下線
源碼解析
前言
所謂踢人下線,核心操作就是找到指定 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。