2013-07-09 10 views
5

Sto usando Apache Shiro nella mia webapp.Shiro ripristina la sessione dopo 2 minuti

Memorizzo alcuni parametri nella sessione, in particolare la chiave primaria di un oggetto memorizzato nel database.

Quando l'utente esegue il login, carico l'oggetto dal database e salva la chiave primaria nella sessione. Quindi all'interno dell'app l'utente può modificare i dati dell'oggetto e premere un pulsante Annulla o Salva.

Entrambi i pulsanti attivano un RPC che ottiene i dati aggiornati sul server. L'oggetto viene quindi aggiornato nel database utilizzando la chiave primaria memorizzata nella sessione.

Se l'utente rimane attivo nell'app (effettuando alcuni RPC), tutto funziona correttamente. Ma se rimane inattivo per 3 minuti e successivamente fa un RPC, Shiro's securityUtils.getSubject().getSession() restituisce null.

Il timeout della sessione è impostato su 1.200.000 ms (20 min), quindi non penso che questo sia il problema.

Quando vado attraverso le sessioni memorizzate nella cache del mio gestore di sessione riesco a vedere la sessione dell'utente org.apache.shiro.session.mgt.SimpleSession,id=6de78f10-b58e-496c-b40a-e2a9a4ad069c ma quando provo ad ottenere l'ID di sessione dal cookie e di chiamare SecurityUtils.getSecurityManager().getSession(key) per ottenere la sessione (dove chiave è una Implementazione di SessionKey): ottengo un'eccezione.

Quando provo a creare un nuovo oggetto dall'ID di sessione, perdo tutti gli attributi salvati nella sessione.

Sono felice di pubblicare del codice per risolvere il problema, ma ho provato così tanti soluzioni alternative che non so da dove iniziare ... Quindi fatemi sapere cosa vi serve.

In alternativa, se qualcuno conosce un quadro migliore di quanto documentato Shiro Sono tutto orecchi (mancanza di documentazione di Shiro rende veramente troppo tempo)

risposta

7

La questione è stata legata alla configurazione della sessione nel file ini. Come al solito con shiro, l'ordine contava e alcune delle mie battute erano fuori luogo.

Di seguito si riporta la configurazione che ha funzionato per me:

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

Quindi quale era la correzione? Questo non è ovvio dalla tua risposta, poiché non hai spiegato cosa hai cambiato o pubblicato la configurazione originale. – frhd

4

Sembra come se hai risolto il problema già. Come hai scoperto, la cosa principale da tenere a mente con il file INI di Shiro è che l'ordine conta; il file viene analizzato in ordine, che può effettivamente essere utile per la costruzione di oggetti utilizzati nella configurazione.

Dal momento che lei ha citato la mancanza di documentazione di Shiro, ho voluto andare avanti e sottolineare due tutorial che ho trovato utile quando si inizia: http://www.javacodegeeks.com/2012/05/apache-shiro-part-1-basics.html e http://www.ibm.com/developerworks/web/library/wa-apacheshiro/.

Ci sono molti altri post del blog che forniscono buone informazioni per integrare la documentazione ufficiale se si guarda intorno.

Buona fortuna!

Problemi correlati