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
}
}
答案 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;
您应该会话中的set
和get
属性。
集:
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;
ContainerRequestContext
有getProperty(String)
和setProperty(String, Object)
个方法,它们在Servlet环境(ServletPropertiesDelegate
)中映射到servlet请求的getAttribute(String)
和setAttribute(String, Object)
方法。
请参阅:Jersey on GitHub