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

时间:2013-06-04 06:26:52

标签: java jersey

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);
    }
}

在泽西过滤器中:

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

4 个答案:

答案 0 :(得分:39)

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

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

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

@Context private HttpServletRequest httpRequest;

答案 1 :(得分:3)

我让@Context正常工作,但问题是我的ContainerRequestFilter是单身。

我必须实施自定义javax.servlet.Filter并使用ThreadLocal来存储HttpServletRequest

答案 2 :(得分:1)

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

@Context
private HttpServletRequest httpRequest;

您应该会话中的setget属性。

集:

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

得到:

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

答案 3 :(得分:1)

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

public void filter(ContainerRequestContext requestContext) throws IOException;

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

请参阅:Jersey on GitHub