如何从Jersey的ContainerRequest中提取请求属性?

HttpServletRequest有一个方法setAttribute(String, Object)

如何从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); } } 

在泽西filter:

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

你不能。 它们不会以任何方式通过Jersey API公开。 如果您搜索Jersey代码库,您会发现HttpServletRequest.getAttributeNames()没有使用,如果它们被集中复制,您可以使用它们。 您还会发现HttpServletRequest.getAttribute()只有少数用法,而且它严格用于内部簿记。

但请注意,当部署在Servlet上下文中时,JAX-RS允许您使用@Context注释注入原始HttpServletRequest。 我不确定你是否可以在Jerseyfilter中执行此操作,但它适用于MessageBodyReaders / Writers和资源类。

更新:我已经检查过,事实上,您可以通过简单地包含以下内容将HttpServletRequest注入Jersey ContainerRequestFilter:

 @Context private HttpServletRequest httpRequest; 

我得到@Context工作,但问题是我的ContainerRequestFilter是单例。

我必须实现一个自定义的javax.servlet.Filter并使用ThreadLocal来存储HttpServletRequest

除了添加上下文之外,我想在以前的答案中添加我的解决方案:

 @Context private HttpServletRequest httpRequest; 

您应该从会话中 setget属性。

组:

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

得到:

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

如果你正在使用实现JAX-RS 2.0的Jersey 2,你可以实现一个ContainerRequestFilter ,它定义了一个过滤方法,如下所示:

public void filter(ContainerRequestContext requestContext) throws IOException;

ContainerRequestContext具有getProperty(String)setProperty(String, Object)方法,它们在Servlet环境( ServletPropertiesDelegate )中映射到servlet请求的getAttribute(String)setAttribute(String, Object)方法。

请参阅: GitHub上的Jersey