26

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

4 回答 4

47

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

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

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

@Context private HttpServletRequest httpRequest;
于 2013-06-09T13:32:32.383 回答
5

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

public void filter(ContainerRequestContext requestContext) throws IOException;

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

参见:GitHub 上的泽西岛

于 2018-05-17T14:51:54.953 回答
4

我得到了@Context工作,但问题是我ContainerRequestFilter是单身人士。

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

于 2014-08-24T12:42:23.133 回答
1

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

@Context
private HttpServletRequest httpRequest;

你应该setget属性来自会话

放:

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

得到:

Object attribute = httpRequest.getSession().getAttribute("businessId");
于 2017-08-28T13:13:28.777 回答