我正在修改我的HttpRequest
上的aWebFilter
,使用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标头添加到请求的详细信息,请参阅此question。如果您打算使用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 documentation。 JAX-RS过滤器可以全局应用,也可以是name-bound到端点的子集。
在REST端点中,您可以注入HttpHeaders
:
@Context
HttpHeaders httpHeaders;
然后使用HttpHeaders
API获取标头值: