如何关闭 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生成视图之前我可以做些啥[关闭]
会话已关闭对象名称:'ISession'。在 NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed() - 如何阻止会话过早关闭