如何从泽西岛的 ContainerRequest 中提取请求属性?

2022-09-01 16:50:47

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

答案 1

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

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

更新:我已经检查过了,事实上,你可以将HttpServletRequest注入到泽西岛容器RequestFilter中,只需包含:

@Context private HttpServletRequest httpRequest;

答案 2

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

public void filter(ContainerRequestContext requestContext) throws IOException;

ContainerRequestContexthas 和 方法,在 Servlet 环境 () 中映射到 Servlet 请求和方法。getProperty(String)setProperty(String, Object)ServletPropertiesDelegategetAttribute(String)setAttribute(String, Object)

参见:GitHub 上的 Jersey


推荐