如何关闭shiro会话

时间:2014-04-03 02:47:34

标签: session logout shiro

当硬编码尝试使用shiro注销时遇到错误。 用户不通过Web登录/注销URL登录和注销,而是通过后端链接。

登录时,它可以正常工作。

Subject currentUser = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(request.getParameter("username"), request.getParameter("password"));
        token.setRememberMe(true);
        try {
            currentUser.login(token);
        } catch (AuthenticationException e) {
            e.printStackTrace();
        }

但是当我尝试注销时出错:

public void userLogout(String sessionId){
    SecurityManager securityManager = SecurityUtils.getSecurityManager();
    Subject.Builder builder = new Subject.Builder(securityManager);
    builder.sessionId(sessionId);
    Subject subject = builder.buildSubject();
    if (null != subject) {
        try {
            subject.logout();
        } catch (SessionException e) {
            // TODO: handle exception
        }
    }
}

但遇到错误[org.apache.shiro.session.UnknownSessionException:没有带id的会话,那么如何手动收集shiro会话?

1 个答案:

答案 0 :(得分:6)

您不应该尝试重新创建会话然后进行操作,您应该使用用户登录的线程通过安全管理器获取会话,如下所示:

SecurityUtils.getSubject().logout();

如果你想以某种方式从另一个线程调用logout,你可以使用SessionDAO接口,但你需要做额外的配置让shiro使用SessionDAO,如下所述:

http://shiro.apache.org/session-management.html#SessionManagement-SessionStorage

正确配置后,您可以执行以下操作:

    DefaultSecurityManager securityManager = (DefaultSecurityManager) SecurityUtils.getSecurityManager();
    DefaultSessionManager sessionManager = (DefaultSessionManager) securityManager.getSessionManager();
    Collection<Session> activeSessions = sessionManager.getSessionDAO().getActiveSessions();
    for (Session session: activeSessions){
        if (sessionId.equals(session.getId()){
            session.stop();
        }
    }