5

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

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

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

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

如果用户在应用程序中保持活动状态(制作一些 RPC),一切正常。但是,如果他保持不活动状态 3 分钟并随后进行 RPC,那么 ShirosecurityUtils.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 缺乏文档,这真的太耗时了)

4

2 回答 2

6

该问题与 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 
于 2013-07-09T23:23:43.720 回答
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/

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

祝你好运!

于 2013-07-10T17:36:07.747 回答