2013-07-09 64 views
5

我在webapp中使用Apache Shiro。Shiro在2分钟后重置会话

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

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

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

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

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

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

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

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

另外,如果有人知道比四郎更好的记录框架,我所有的耳朵(Shiro的缺乏文件使得消费真的太时)

回答

7

的问题涉及到ini文件的会话配置。和往常一样,顺序非常重要,我的一些线路不合适。

下面是为我工作的配置:

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 
+0

那么修复是什么?这从你的回答中并不明显,因为你没有解释你已经改变或发布了原始配置。 – frhd

4

听起来好像你已经整理出来你的问题。正如你发现的,要记住Shiro INI文件的主要内容是顺序很重要;该文件按顺序进行解析,这对于构建配置中使用的对象实际上可能很有用。

既然你提到Shiro的缺乏文件,我想继续前进,指出两个教程,我开始的时候发现的有用: http://www.javacodegeeks.com/2012/05/apache-shiro-part-1-basics.htmlhttp://www.ibm.com/developerworks/web/library/wa-apacheshiro/

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

祝你好运!