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

Dej*_*ell 21 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在泽西过滤器:

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

Rya*_*art 43

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

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

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

@Context private HttpServletRequest httpRequest;
Run Code Online (Sandbox Code Playgroud)


Ste*_*tez 6

如果您使用实现 JAX-RS 2.0 的 Jersey 2,则可以实现ContainerRequestFilter定义过滤器方法的 a ,如下所示:

public void filter(ContainerRequestContext requestContext) throws IOException;

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

请参阅:GitHub 上的泽西岛