我正在通过添加单个标头来修改HttpRequest
我WebFilter
的request
使用HttpServletRequestWrapper
实现类:
HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(request); requestWrapper.addHeader(OAuth.OAUTH_ACCESS_TOKEN, accessTokenWord); chain.doFilter(requestWrapper, response);
后doFilter(requestWrapper, response)
进行,JAX-RS导致请求到它的资源,其具有@RequestScoped
字段:
@Inject protected HttpServletRequest request;
但是,它不包含任何预期的标头:
@PostConstruct protected void initialize_resources() throws IllegalStateException { this.currentUser = null; String accessToken = this.request.getHeader(OAuth.OAUTH_ACCESS_TOKEN); AccessToken accessToken = this.memcachedResources.getMemcachedAccessTokenRepository() .get(accessToken); if (accessToken != null && StringUtils.isNotEmpty(accessToken.getUser_id())) { this.currentUser = this.em.find(User.class, accessToken.getUser_id()); this.currentClient = accessToken.getClientId(); } }
所以,this.request.getHeader(OAuth.OAUTH_ACCESS_TOKEN)
是的null
.
我怎么解决这个问题?
有关如何使用servlet过滤器将HTTP标头添加到请求的详细信息,请参阅此问题.如果您打算使用JAX-RS过滤器,请继续阅读.
使用JAX-RS后,最好使用ContainerRequestFilter
以下内容为请求添加标头:
@Provider public class MyContainerRequestFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException { requestContext.getHeaders().add("header", "value"); } }
请注意以下事项:
所述ContainerRequestContext#getHeaders()
返回一个可变多值图,其包含请求报头.
该@Provider
注释标记的扩展接口期间提供扫描阶段,应该是由JAX-RS运行时发现的实现.
有关JAX-RS过滤器的更多详细信息,请查看Jersey文档.JAX-RS过滤器可以全局应用,也可以与端点子集绑定名称.
在REST端点中,您可以注入HttpHeaders
:
@Context HttpHeaders httpHeaders;
然后使用HttpHeaders
API获取标头值:
HttpHeaders#getHeaderString(String)
HttpHeaders#getRequestHeaders()
HttpHeaders#getHeaderString(String)