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