如何从Jersey的ContainerRequest中提取请求属性?
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); } }
在泽西filter:
private class Filter implements ResourceFilter, ContainerRequestFilter { public ContainerRequest filter(ContainerRequest request) { // ..extract the attribute from the httpReq } }
你不能。 它们不会以任何方式通过Jersey API公开。 如果您搜索Jersey代码库,您会发现HttpServletRequest.getAttributeNames()
没有使用,如果它们被集中复制,您可以使用它们。 您还会发现HttpServletRequest.getAttribute()
只有少数用法,而且它严格用于内部簿记。
但请注意,当部署在Servlet上下文中时,JAX-RS允许您使用@Context
注释注入原始HttpServletRequest。 我不确定你是否可以在Jerseyfilter中执行此操作,但它适用于MessageBodyReaders / Writers和资源类。
更新:我已经检查过,事实上,您可以通过简单地包含以下内容将HttpServletRequest注入Jersey ContainerRequestFilter:
@Context private HttpServletRequest httpRequest;
我得到@Context
工作,但问题是我的ContainerRequestFilter
是单例。
我必须实现一个自定义的javax.servlet.Filter
并使用ThreadLocal
来存储HttpServletRequest
。
除了添加上下文之外,我想在以前的答案中添加我的解决方案:
@Context private HttpServletRequest httpRequest;
您应该从会话中 set
和get
属性。
组:
httpRequest.getSession().setAttribute("businessId", "yourId");
得到:
Object attribute = httpRequest.getSession().getAttribute("businessId");
如果你正在使用实现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)
方法。
请参阅: GitHub上的Jersey