2013-08-20 63 views
8

我在寫一個Jersey Response過濾器。我正在使用澤西島1.17。我想在過濾器API中訪問httpServletRequest的一些屬性。我現在正在做的事情如下。注入servletRequest是否安全,如下面的代碼片段,否則會導致某種併發性問題?如果有多個請求同時進入,請求中的servletRequest是否會互相覆蓋?謝謝你的回覆。@Context HttpServletRequest範圍在澤西島ContainerResponseFilter

public class LoggingFilter implements ContainerResponseFilter { 
@Context private HttpServletRequest servletRequest; 
@Override 
public ContainerResponse filter(final ContainerRequest req, final ContainerResponse resp) { 
String s = this.servletRequest.getAttribute("xxx"); 
.... 
} 
} 

回答

6

第9.1節(最新,5.1以前)的JAX-RS specification狀態的併發性:

上下文是SPECI音響C到一個特定的請求,但某些 JAX-RS組分(供應商和資源類的實例有生命週期 其他而不是每個請求)可能需要支持多個併發的 請求。當注入一個 第9.2節列出的類型的實例時,提供的實例必須能夠爲特定的請求選擇正確的上下文 。使用線程本地代理是實現此目的的常用方式。

因此,根據規範,需要JAX-RS實現(例如Jersey)來確保上下文是安全的。繼續做你正在做的事情。

另請參閱:Extract request attributes from container request of Jersey

+1

非常感謝。我沒想到人們會這麼快回答我的問題。這真的讓我感到驚訝並解決了這個問題。 – lorcel

6

你很安全。當您注入HttpServletRequest/HttpServletResponse時,您並不是在處理某個特定實例,而是在代理中處理某個實例,通過該代理調用存儲在ThreadLocal對象中的實際實例上的調用。每個請求都由一個單獨的線程處理,該線程可以訪問它自己的HttpServletRequest/HttpServletResponse。除了注入HttpServletRequest/HttpServletResponse,您還可以注入ThreadLocal<HttpServletRequest>/ThreadLocal<HttpServletResponse>並通過'#get()`方法獲得代理的真正請求/響應實例。

+0

謝謝Michal。其實我沒想到人們會這麼快回答我的問題。這真的讓我感到驚訝並解決了這個問題。 – lorcel