shiro利用過期時間,解決用戶凍結踢出問題


背景

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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM