2013-07-09 101 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/

還有不少博客文章提供了很好的信息來補充官方文檔,如果你環顧四周。

祝你好運!