背景
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;
}
