2013-06-04 103 views
15

HttpServletRequest的容器請求屬性有一個方法:提取請求從澤西島

setAttribute 

我怎樣才能提取ContainterRequest這個屬性?

我沒有找到:getAttribute方法!

代碼

public class AuthenticationFilter implements Filter{ 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpReq = (HttpServletRequest) servletRequest; 
     .... .... 
     httpReq.setAttribute("businessId", businessId); 
    } 
} 

在新澤西州過濾器:

private class Filter implements ResourceFilter, ContainerRequestFilter{ 
    public ContainerRequest filter(ContainerRequest request) { 
     ..extract the attribute from the httpReq 
    } 
} 
+0

請問您可否包括一些代碼演示你想要做什麼? – 2013-06-04 06:31:46

+0

我編輯了我的問題。謝謝! – Dejell

回答

33

你不能。他們沒有以任何方式通過Jersey API公開。如果您搜索澤西島代碼庫,您會發現沒有使用HttpServletRequest.getAttributeNames(),如果它們被大量複製,則會使用它。您還會發現HttpServletRequest.getAttribute()只有少數用途,並且嚴格用於內部簿記。

但是,請注意,當部署在Servlet上下文中時,JAX-RS允許您使用@Context註釋注入原始HttpServletRequest。我不確定您是否可以在Jersey篩選器中執行此操作,但它可以在MessageBodyReaders/Writers和資源類中使用。

更新:我檢查了,你可以,事實上,注入的HttpServletRequest到新澤西ContainerRequestFilter通過簡單地包括:

@Context private HttpServletRequest httpRequest; 
+0

我可以將它注入澤西島過濾器嗎? – Dejell

+0

是的。查看我的更新。 –

+0

那麼爲什麼Jersey不簡單地擴展HttpServletRequest呢? – Dejell

3

我得到了@Context工作,但問題是,我的ContainerRequestFilter是單身人士。

我不得不實施自定義javax.servlet.Filter並使用ThreadLocal來存儲HttpServletRequest

0

我想添加到以前的答案我的解決方案,除了添加背景:

@Context 
private HttpServletRequest httpRequest; 

您應該會議setget屬性,獲取:

httpRequest.getSession().setAttribute("businessId", "yourId"); 

套裝:

Object attribute = httpRequest.getSession().getAttribute("businessId");