2014-01-17 123 views
4

我試圖將我的webapp的會話管理(目前由Catalina/Tomcat處理)替換爲shiro本地會話管理。SessionListener中的Shiro HttpSession?

這應該是一個相當簡單的工作,如通過四郎網站adverted:

透明HttpSession的支持 - 如果你正在使用四郎的本地 會議,我們已經實現了HTTP會話API和Servlet 2.5的API 所以你不必改變任何你現有的網頁代碼來使用 Shiro。

所以之後,你用Shiro的DefaultWebSessionManager替換了本地會話管理器,所有的東西都應該可以直接使用。

這也是我的webapp的情況,除了某個javax.servlet.http.HttpSessionListener。自從使用Shiro的會話管理以來,此監聽器不再獲得事件。

不用擔心我以爲! Shiro提供它自己的org.apache.shiro.session.SessionListener接口,可以鏈接到會話管理器。

但是,這個接口與javax.servlet.http.HttpSessionListener差別很大。不再有HttpSession對象通過,而是Shiro Listener通過它自己的org.apache.shiro.session.Session對象與事件。

我現有的實施作品只有HttpSession個對象。我發現一個四郎Session可以轉化爲一個HttpSession

// HttpServletRequest currentRequest; 
// ServletContext servletContext; 
// Session session; 
HttpSession httpSession = new ShiroHttpSession(session, currentRequest, servletContext); 

但是沒有辦法從四郎SessionListener存取權限的HttpServletRequest和參數servletContext。

任何想法如何解決這個問題,例如,你能回答這兩個問題中的一個嗎?

  1. 爲什麼舊的javax.servlet.http.HttpSessionListener不再叫 叫?
  2. 如何將Shiro Session對象變爲HttpSession shiro SessionListener中的對象?

回答

3

爲什麼老javax.servlet.http.HttpSessionListener不再 叫什麼名字?

正如您所解釋的,會話管理現在通過Shiro而不是通過Servlet容器來處理。因此,即使您的HttpSessionListener已註冊,您的Servlet容器也不會創建任何HttpSession對象,因此不會使用任何HttpSessionListener回調。

如何轉變四郎Session對象HttpSession對象在 四郎SessionListener

你不這樣做,你不應該。

如果您解釋您想要對HttpSession做什麼,我們可能會找到替代方案。

+0

簡而言之,我舊的SessionListener中的所有代碼都被寫入與HttpSessions一起使用。我怎樣才能重用這段代碼,而不必將它全部重構爲使用Shiro Session對象?這將是相當多的工作。 –

+0

@KarstenDaemen你正在使用什麼'HttpSession'方法? Shiro的'Session'也具有屬性設置器和getter,但顯然這些對於JSP等是不可用的。 –