【问题标题】:Shiro throws an exception when session expires / invalidates会话过期/失效时 Shiro 抛出异常
【发布时间】:2014-12-24 22:32:39
【问题描述】:

我尝试在 Grails 中使用本机会话:

[main]
sessionManager = org.apache.shiro.session.mgt.DefaultSessionManager
securityManager.sessionManager = \$sessionManager

在未找到会话或使其无效之前,它可以正常工作。

  1. 启动服务器。登录
  2. 重启服务器。

        org.apache.shiro.session.ExpiredSessionException: Session with id [3c3ffbef-ee93-4f6e-a599-1f1f4c03d037] has expired. Last access time: 29.10.14 12:18.  Current time: 29.10.14 12:18.  Session timeout is set to 1 seconds (0 minutes)
            at org.apache.shiro.session.mgt.SimpleSession.validate(SimpleSession.java:292)
            at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doValidate(AbstractValidatingSessionManager.java:186)
            at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.validate(AbstractValidatingSessionManager.java:143)
            at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSessionManager.java:120)
            at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupSession(AbstractNativeSessionManager.java:108)
            at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupRequiredSession(AbstractNativeSessionManager.java:112)
            at org.apache.shiro.session.mgt.AbstractNativeSessionManager.getAttribute(AbstractNativeSessionManager.java:209)
            at org.apache.shiro.session.mgt.DelegatingSession.getAttribute(DelegatingSession.java:141)
            at org.apache.shiro.session.ProxiedSession.getAttribute(ProxiedSession.java:121)
            at org.apache.shiro.subject.support.DelegatingSubject.getRunAsPrincipalsStack(DelegatingSubject.java:469)
            at org.apache.shiro.subject.support.DelegatingSubject.getPrincipals(DelegatingSubject.java:153)
            at org.apache.shiro.subject.support.DelegatingSubject.getPrincipal(DelegatingSubject.java:149)
            at org.apache.shiro.web.servlet.ShiroHttpServletRequest.getSubjectPrincipal(ShiroHttpServletRequest.java:95)
            at org.apache.shiro.web.servlet.ShiroHttpServletRequest.getUserPrincipal(ShiroHttpServletRequest.java:111)
    

有什么意义?为什么 Shiro 会抛出异常而不是静默处理?它使 shiro 会话无法使用。

有趣的是连登出都不起作用:
1.ShiroHttpServletRequest记住校长的会话
2. SecurityUtils.subject?.logout() 使委托人的会话无效
3. 在处理响应时,某些访问会话(request.getSession(false)),它返回无效会话 => org.apache.shiro.session.UnknownSessionException

There is no session with id [86f8b1dc-0c16-4836-9564-c8cc3cc1c03a]. Stacktrace follows:
java.lang.IllegalStateException: org.apache.shiro.session.UnknownSessionException: There is no session with id [86f8b1dc-0c16-4836-9564-c8cc3cc1c03a]
    at org.apache.shiro.web.servlet.ShiroHttpSession.getAttribute(ShiroHttpSession.java:133)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)

使用原生 Shiro 会话的正确方法是什么?

【问题讨论】:

    标签: java session grails shiro


    【解决方案1】:

    您似乎正在使用非网络会话管理器。这不使用 httpsession 的东西,这是您在像 grails 这样的 servlet 环境中真正需要的东西,因为 Web 服务器会帮助您使会话失效或在重新部署时恢复它们。

    改用 DefaultWebSessionManager:

    [main]
    sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
    

    它扩展了 DefaultSessionManager,因此您可以使用 Web 会话管理器进行任何操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 2017-05-24
      • 2012-11-30
      • 2012-08-05
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多