背景
shiro中需要凍結某個用戶,但是此時此刻這個用戶在線,如果凍結只是改變狀態的話,只會導致用戶不滿,所以要改變這個辦法.
在查找過程中發現都是告訴shiro寫自定義過濾器,那么我如果自定義過濾器我就不太想用shiro了,難道shiro中只能用自定義過濾寫這個嗎?
解決
利用shiro依靠的session,來進行一個session過期,讓用戶重新登陸,用戶登陸就會發現自己被凍結。
代碼如下,解釋一下為什么我自己去獲取這個SessionDao,原因是springboot注入的SessionDao總是有問題。
public void invoking(Long userId)
{ Session sessionByUsername = getSessionByUsername(userId); //設置過期實踐為1毫秒 if (sessionByUsername != null)
{ sessionByUsername.setTimeout(1); } }
/** * 獲取指定用戶名的Session * @param userId * @return */ public Session getSessionByUsername(Long userId) { DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager)SecurityUtils.getSecurityManager(); DefaultWebSessionManager sessionManager = (DefaultWebSessionManager) securityManager.getSessionManager(); SessionDAO sessionDAO = sessionManager.getSessionDAO(); Collection<Session> sessions = sessionDAO.getActiveSessions(); User user; Object attribute; for (Session session : sessions) { attribute = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); if (attribute == null) { continue; } user = (User) ((SimplePrincipalCollection) attribute).getPrimaryPrincipal(); if (user == null) { continue; } if (userId.equals(user.getAccount())) { return session; } } return null; }