SpringBoot + Shiro實現(xiàn)當前在線人數(shù)統(tǒng)計
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質文章,第一時間送達
? 作者?|??編程小白-郭旭
來源 |? urlify.cn/jaayq2
實現(xiàn)思路
數(shù)據(jù)庫中添加用戶是否登錄is_login字段,用來記錄用戶的登錄狀態(tài),假設1表示在線;0表示未在線,則需要進行控制:
1)當用戶登錄成功時,設置用戶登錄狀態(tài)為1
2)當用戶退出登錄時,設置用戶登錄狀態(tài)為0
3)當session失效時,設置對應的用戶的登錄狀態(tài)為0
實現(xiàn)方法
1、更改數(shù)據(jù)庫字段,編寫登錄狀態(tài)更新函數(shù)
添加字段后,編寫狀態(tài)更新函數(shù)
/**?更改用戶登錄狀態(tài)?*/
void?updateLoginStatus(@Param("userId")?String?userId,?@Param("islogin")?Integer?islogin);
"updateLoginStatus">
????????UPDATE?`user`?SET?`islogin`=#{islogin}?WHERE?id?=?#{userId}
2、自定義SessionLinstener,重寫監(jiān)聽函數(shù)
自定義一個類ShiroSessionLinstener,繼承SessionLinstenerAdapter類,同時重寫監(jiān)聽函數(shù)
1)session創(chuàng)建時,輸出sessionId,不進行任何操作
2)session停止時,輸入sessionId和session存儲的用戶Id,不進行任何操作
3)session失效時,輸入sessionId,重置對應的用戶的登錄狀態(tài)為0
public?class?ShiroSessionListener?extends?SessionListenerAdapter?{
????@Resource
????private?UserService?userService;
????//?session創(chuàng)建
????@Override
????public?void?onStart(Session?session)?{
????????super.onStart(session);
????????System.out.println("session創(chuàng)建,sessionId:"?+?session.getId());
????}
????//?session停止
????@Override
????public?void?onStop(Session?session)?{
????????System.out.println("session停止,sessionId:"?+?session.getId()?+",用戶id:"?+?session.getAttribute("loginUserId"));
????}
????//?session失效
????@Override
????public?void?onExpiration(Session?session)?{
????????//?重置登錄狀態(tài)
????????userService.updateLoginStatus(session.getAttribute("loginUserId").toString(),?LoginStatusEnum.NOT_LOGIN.getCode());
????????System.out.println("session失效,sessionId:"?+?session.getId()?+",用戶id:"?+?session.getAttribute("loginUserId"));
????}
}
3、配置session監(jiān)聽及屬性(均通過SessionManager進行配置)
1)使用setGlobalSessionTimeout(1800000L)設置session的過期時間為30分鐘(可自定義)
2)使用setSessionValidationSchedulerEnabled(true)開啟session檢查
3)使用setSessionValidationInterval(15?*?60?*?1000L)設置檢查間隔為15分鐘
4)設置監(jiān)聽類為第2步自定義的類
Collection?listeners?=?new?ArrayList<>();
listeners.add(shiroSessionListener());
sessionManager.setSessionListeners(listeners); 
?最后不要忘記把SessionManager配置到ShiroConfig中
4、編寫查詢函數(shù)查詢在線人數(shù)
/**?獲取在線人數(shù)?*/
Integer?getLoginCount();
粉絲福利:108本java從入門到大神精選電子書領取
???
?長按上方鋒哥微信二維碼?2 秒 備注「1234」即可獲取資料以及 可以進入java1234官方微信群
感謝點贊支持下哈?
評論
圖片
表情
