2014-10-29 58 views
1

我試圖用本地會話使用Grails:四郎拋出一個異常/無效

[main] 
sessionManager = org.apache.shiro.session.mgt.DefaultSessionManager 
securityManager.sessionManager = \$sessionManager 

直到會話找不到或無效它的偉大工程。

  1. 啓動服務器。登錄
  2. 重新啓動服務器。

    org.apache.shiro.session.ExpiredSessionException: Session with id [3c3ffbef-ee93-4f6e-a599-1f1f4c03d037] has expired. Last access time: 29.10.14 12:18. Current time: 29.10.14 12:18. Session timeout is set to 1 seconds (0 minutes) 
         at org.apache.shiro.session.mgt.SimpleSession.validate(SimpleSession.java:292) 
         at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doValidate(AbstractValidatingSessionManager.java:186) 
         at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.validate(AbstractValidatingSessionManager.java:143) 
         at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSessionManager.java:120) 
         at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupSession(AbstractNativeSessionManager.java:108) 
         at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupRequiredSession(AbstractNativeSessionManager.java:112) 
         at org.apache.shiro.session.mgt.AbstractNativeSessionManager.getAttribute(AbstractNativeSessionManager.java:209) 
         at org.apache.shiro.session.mgt.DelegatingSession.getAttribute(DelegatingSession.java:141) 
         at org.apache.shiro.session.ProxiedSession.getAttribute(ProxiedSession.java:121) 
         at org.apache.shiro.subject.support.DelegatingSubject.getRunAsPrincipalsStack(DelegatingSubject.java:469) 
         at org.apache.shiro.subject.support.DelegatingSubject.getPrincipals(DelegatingSubject.java:153) 
         at org.apache.shiro.subject.support.DelegatingSubject.getPrincipal(DelegatingSubject.java:149) 
         at org.apache.shiro.web.servlet.ShiroHttpServletRequest.getSubjectPrincipal(ShiroHttpServletRequest.java:95) 
         at org.apache.shiro.web.servlet.ShiroHttpServletRequest.getUserPrincipal(ShiroHttpServletRequest.java:111) 
    

有什麼意義?爲什麼Shiro會拋出異常而不是靜默處理它?它使得shiro會話無法使用。

這很有趣,甚至註銷不起作用:
1. ShiroHttpServletRequest記得校長會議
2. SecurityUtils.subject?.logout()無效校長會議
3.在處理響應存取東西會議(request.getSession(false)),它返回無效的會話=>org.apache.shiro.session.UnknownSessionException

There is no session with id [86f8b1dc-0c16-4836-9564-c8cc3cc1c03a]. Stacktrace follows: 
java.lang.IllegalStateException: org.apache.shiro.session.UnknownSessionException: There is no session with id [86f8b1dc-0c16-4836-9564-c8cc3cc1c03a] 
    at org.apache.shiro.web.servlet.ShiroHttpSession.getAttribute(ShiroHttpSession.java:133) 
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195) 
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) 
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) 
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) 

什麼是使用本機Shiro會話的正確方法?

回答

0

看起來您正在使用非Web會話管理器。這不會利用httpsession的東西,你真的想在像grails這樣的servlet環境中使用,因爲Web服務器可以幫助你使會話無效或在重新部署時恢復它們。

使用DefaultWebSessionManager代替:

[main] 
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager 

它擴展DefaultSessionManager,所以任何你想用,這樣做,你可以與網絡會話管理器做的。