我需要一種機制來從Java類讀取會話狀態,而不必將任何參數(包括HttpRequest)傳遞給類。原因是該類距離該servlet只有1-3個調用,並且我不想用每次調用的額外參數來污染方法參數列表。 我基本上這些傢伙相同的概率: http://forums.sun.com/thread.jspa?threadID=5124189如何訪問標準Java類中的會話狀態?
對於這顯然Java沒有目前的解決方案..
乾杯
我需要一種機制來從Java類讀取會話狀態,而不必將任何參數(包括HttpRequest)傳遞給類。原因是該類距離該servlet只有1-3個調用,並且我不想用每次調用的額外參數來污染方法參數列表。 我基本上這些傢伙相同的概率: http://forums.sun.com/thread.jspa?threadID=5124189如何訪問標準Java類中的會話狀態?
對於這顯然Java沒有目前的解決方案..
乾杯
誘人的機制是使用ThreadLocal的存儲,但在一些應用服務器這是很危險的 - 應用服務器可能使用線程池,並且單個請求可能由不同線程的不同線程處理。
某些應用程序服務器(我知道WebSphere確實)爲此提供了特定的API。在WAS中它是一個UserWorkArea。請參閱here以獲取參考資料,稍後介紹該文章。
我不知道這個問題的便攜式解決方案。
一種解決方案可能是使用ThreadLocal。在請求結束時請小心清理它。
我如何知道請求的結束時間?你知道我是否可以在struts攔截器內安全地使用threadlocal? – Ricardo 2010-10-01 09:40:56
不要將HttpSession傳遞給你「標準」的Java類。爲了獲得更好的解決方案,請檢查Spring或Guice等依賴注入容器,並閱讀會話範圍。
這通常是通過線程本地模式和servlet過濾器的組合來解決的,但通常使用「標準」Java類直接訪問會話,請求等是很糟糕的。
我完全同意。 +1 – 2010-10-01 08:18:13
你想要的是一個全局變量,並且「污染」其他類中的參數列表會更清晰。它變得更容易閱讀和測試。
如果您想避免依賴於servlet.jar的代碼,請使用適配器模式:爲您所需的操作創建一個接口,讓您的方法接受該接口的參數,然後製作一個簡單的包裝器實現只是委託給HttpSession。
是的,我們在WAS中這樣做。出於同樣的原因,我沒有提出這個建議。所以,我會說+1。 – 2010-10-01 08:16:56
發現這個,http://www.devwebsphere.com/devwebsphere/2005/06/dont_use_thread.html。雖然年代久遠,但我認爲它值得閱讀。 – 2010-10-01 08:22:20
謝謝,即時通訊使用Tomcat6,並不確定它是否是1線程/請求...將進入線程本地 - 謝謝! – Ricardo 2010-10-01 09:17:30