我在我的webapp中使用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)
时session(其中key是SessionKey实现):我得到一个异常。
当我尝试从会话ID构建新主题时,我会丢失会话中保存的所有属性。
我很高兴发布一些代码来帮助解决问题,但我尝试了很多解决方法,我不知道从哪里开始......所以请让我知道你需要什么。
或者,如果有人知道一个比Shiro更好的文档框架我很满意(Shiro缺乏文档会让它太费时间)
答案 0 :(得分:7)
该问题与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
答案 1 :(得分:4)
听起来好像你已经解决了你的问题。正如您所发现的,要记住Shiro INI文件的主要内容是订单很重要;该文件按顺序解析,实际上可用于构造配置中使用的对象。
由于您提到了Shiro缺少文档,我想继续并指出我在开始时发现有用的两个教程: http://www.javacodegeeks.com/2012/05/apache-shiro-part-1-basics.html 和 http://www.ibm.com/developerworks/web/library/wa-apacheshiro/
如果你环顾四周,还有很多其他博客文章提供了补充官方文档的良好信息。
祝你好运!