2013-06-04 131 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");