2009-12-28 140 views
7

我想一個JPA的EntityManager綁定到每個請求(通過ThreadLocal的)當前線程,什麼可能通過ServletRequestListener或過濾器來完成。聽衆看起來更乾淨,在這種情況下我不需要額外的過濾器。但也許過濾器有我已經錯過的優勢。Servlet過濾器與ServletRequestListener

我應該使用Servlet過濾器或ServletRequestListener做到這一點?

+1

是關於ServletRequestListener做有螺紋的保證?您確定它是在請求處理的同一線程上同步調用的? – 2009-12-28 16:40:00

+0

在Servlet 3.0規範說:「11.5監聽器的實例和線程 [...],直到最後的請求提供服務的Web應用程序容器必須保持對每個監聽器實例的引用 屬性改變的ServletContext和HttpSession的對象可能CCUR。容器不需要將結果通知同步到屬性監聽器類,維護狀態的監聽器類負責數據的完整性,並且應該明確地處理這種情況。 但這不是你的問題的答案......我*認爲*它將在同一個線程。 – deamon 2009-12-28 17:03:13

回答

7

你的目的沒有太大的區別。但是,聽衆是「更乾淨」的,因爲讀過你的代碼的人會立即知道這段代碼的目的不可能是攔截請求或改變它,或者做一個過濾器可以做的其他事情。例如,Spring使用ServletRequestListener來允許不使用Spring自己的Web MVC框架的基於Spring的基於Web的應用程序訪問特定於Web的功能,例如會話範圍的Bean。請參閱this doc

編輯:只是爲了更清晰,我提到Spring的RequestContextListener因爲它正是你在說什麼:創建一個ThreadLocal的對象,可以在整個請求生命週期的其餘部分可以訪問存儲數據。

+0

你能爲我澄清這件事嗎? 'ServletRequestListener'監聽'ServletRequestEvent',這是一個爲每個傳入請求觸發的事件。如果我想將每個請求的用戶代理記錄到我的Web應用程序,我應該使用此偵聽器還是過濾器? – arun 2014-08-23 20:19:53

+0

兩者都可能是好的。 – Dan 2014-09-10 19:09:52