如何关闭 shiro 会话

Posted

技术标签:

【中文标题】如何关闭 shiro 会话【英文标题】:how to close shiro session 【发布时间】:2014-05-14 15:35:10 【问题描述】:

硬编码尝试使用 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: There is no session with id ,那么如何手动关闭 shiro 会话?

【问题讨论】:

我被用户currentUser.logout修复了,甚至不知道根本原因。 因为如果使用上述方法关闭当前会话,当前线程无法运行。 【参考方案1】:

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

SecurityUtils.getSubject().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();
        
    

【讨论】:

是的,我注意到了并解决了这个问题。我不应该尝试通过 getSession(sessionId).logout 关闭当前线程。它导致在当前线程结束之前无法找到会话。无论如何,谢谢。 这对我不起作用。我将“apache Shiro”与 JSP servlet 一起使用,而 Shiro 与浏览器弹出登录一起使用。

以上是关于如何关闭 shiro 会话的主要内容,如果未能解决你的问题,请参考以下文章

在使用spring mvc jsp shiro生成视图之前我可以做些啥[关闭]

Shiro 会话注销不起作用

ShiroApache Shiro Session管理

会话已关闭对象名称:'ISession'。在 NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed() - 如何阻止会话过早关闭

我如何知道一个 mgo 会话是不是已关闭

Chrome 关闭后 Jsessionid cookie 不会过期