Shiro单用户登录,清理之前登录的用户

方法一

/**
 * @功能描述:   单用户登录,清除当前用户以前登录时保存的session会话
 * @param loginName
 */
public void singleUseLogin(String loginName){
    // 1.获取当前用户sessionId
    String currentUserSessionId = SecurityUtils.getSubject().getSession().getId().toString();

    // 2.获取shiro的sessionManager
    DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
        DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();

        // 3.获取所有已登录用户的session列表
        Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();

        User user = null;
        if (sessions.size() > 1) {
            System.out.println("仅允许单用户登录,开始清理遗留用户信息~");
            for(Session onlineSession:sessions){
                // 4. 获取已登录用户的session的key值
                SimplePrincipalCollection simplePrincipalCollection = (SimplePrincipalCollection) onlineSession.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
                // 5. 获取new SimpleAuthenticationInfo(user, pwd, this.getName())中放进去的第一个参数
                user = (User) simplePrincipalCollection.getPrimaryPrincipal();

                // 6. 清除当前用户以前登录时保存的session会话
                if (loginName.equals(user.getUserName()) && !onlineSession.getId().equals(currentUserSessionId)) {
                    sessionManager.getSessionDAO().delete(onlineSession);
                    System.out.println("清理用户["+loginName+"],SessionId为["+onlineSession.getId()+"]的Session信息!");
                }
            }
    } else {
        System.out.println("无可清理用户信息~");
    }
}

方法二,优化版

/**
 * @功能描述:   单用户登录,清除当前用户以前登录时保存的session会话
 * @param loginName
 */
public void singleUseLogin(String loginName){
    // 1.获取当前用户sessionId
    String currentUserSessionId = SecurityUtils.getSubject().getSession().getId().toString();
    // 2.获取当前用户
    User user = (User) SecurityUtils.getSubject().getPrincipal();
    // 3.获取shiro的sessionManager
    DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
    DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
    // 4.获取所有已登录用户的session列表
    Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();

    if (sessions.size() > 1) {
        System.out.println("仅允许单用户登录,开始清理遗留用户信息~");
        for(Session onlineSession:sessions){
            // 5. 清除当前用户以前登录时保存的session会话
            if (loginName.equals(user.getUserName()) && !onlineSession.getId().equals(currentUserSessionId)) {
                sessionManager.getSessionDAO().delete(onlineSession);
                System.out.println("清理用户["+loginName+"],SessionId为["+onlineSession.getId()+"]的Session信息!");
            }
        }
    } else {
        System.out.println("无可清理用户信息~");
    }
}

转载于:https://blog.51cto.com/1197822/2324201

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值