Shiro 在 2 分钟后重置会话

Posted

技术标签:

【中文标题】Shiro 在 2 分钟后重置会话【英文标题】:Shiro resets the session after 2 min 【发布时间】:2013-07-07 13:33:42 【问题描述】:

我在我的 web 应用程序中使用 Apache Shiro。

我在会话中存储了一些参数,特别是存储在数据库中的对象的主键。

当用户登录时,我从数据库中加载对象并将主键保存在会话中。然后在应用程序中,用户可以编辑对象的数据并点击取消或保存按钮。

两个按钮都会触发一个 RPC,将更新的数据发送到服务器。然后使用存储在会话中的主键在数据库中更新对象。

如果用户在应用程序中保持活动状态(制作一些 RPC),一切正常。但是,如果他保持不活动状态 3 分钟并随后进行 RPC,那么 Shiro 的 securityUtils.getSubject().getSession() 将返回 null。

会话超时设置为 1,200,000 毫秒(20 分钟),所以我认为这不是问题所在。

当我浏览存储在会话管理器缓存中的会话时,我可以看到用户的会话 org.apache.shiro.session.mgt.SimpleSession,id=6de78f10-b58e-496c-b40a-e2a9a4ad069c,但是当我尝试从 cookie 中获取会话 ID 并调用 SecurityUtils.getSecurityManager().getSession(key) 来获取会话时(其中key 是一个 SessionKey 实现):我得到一个异常。

当我尝试从会话 ID 构建新主题时,我丢失了会话中保存的所有属性。

我很高兴发布一些代码来帮助解决问题,但是我尝试了很多变通方法,以至于我不知道从哪里开始......所以请告诉我你需要什么。

或者,如果有人知道比 Shiro 更好的文档框架,我会全力以赴(Shiro 缺乏文档,这真的太耗时了)

【问题讨论】:

【参考方案1】:

问题与 ini 文件中的会话配置有关。与 shiro 一样,顺序很重要,我的一些台词不合适。

以下是对我有用的配置:

sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
#sessionDAO.activeSessionsCacheName = dropship-activeSessionCache
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionManager.sessionDAO = $sessionDAO
# cookie for single sign on 
cookie = org.apache.shiro.web.servlet.SimpleCookie 
cookie.name = www.foo.com.session 
cookie.path = / 
sessionManager.sessionIdCookie = $cookie
# 1,800,000 milliseconds = 30 mins
sessionManager.globalSessionTimeout = 1800000
sessionValidationScheduler =
org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler
sessionValidationScheduler.interval = 1800000
sessionManager.sessionValidationScheduler = $sessionValidationScheduler
securityManager.sessionManager = $sessionManager
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
securityManager.cacheManager = $cacheManager 

【讨论】:

那么解决方法是什么?这从您的回答中并不明显,因为您没有解释您更改了什么或发布了原始配置。【参考方案2】:

听起来你已经解决了你的问题。正如您所发现的,使用 Shiro INI 文件要记住的主要事情是顺序很重要;该文件是按顺序解析的,这实际上对于构造配置中使用的对象很有用。

既然你提到了 Shiro 缺乏文档,我想继续指出两个我发现在开始时很有帮助的教程: http://www.javacodegeeks.com/2012/05/apache-shiro-part-1-basics.html 和 http://www.ibm.com/developerworks/web/library/wa-apacheshiro/.

如果您环顾四周,还有很多其他博客文章提供了很好的信息来补充官方文档。

祝你好运!

【讨论】:

以上是关于Shiro 在 2 分钟后重置会话的主要内容,如果未能解决你的问题,请参考以下文章

Rails 登录重置会话

10 分钟后重置 Swift 应用程序

会话超时是不是在每个请求上重置

PHP - 您是不是需要再次设置会话数据以重置生命周期?

SESSION 变量在 Codeigniter php 中的 redirect() 上被重置

是啥导致发送 TCP/IP 重置 (RST) 标志?