如何使用 JAX-RS 中的过滤器将 header 添加到 HTTP 请求?

How to add a header to HTTP request using a filter in JAX-RS?

我正在修改 WebFilter 上的 HttpRequest,方法是使用 HttpServletRequestWrapper 实现 class 将单个 header 添加到 request :

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;

但是,它不包含任何预期的 header:

@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 header 添加到请求的详细信息,请参阅此 question。如果您打算使用 JAX-RS 过滤器,请继续阅读。


JAX-RS 过滤器

使用 JAX-RS 后,您最好像下面这样使用 ContainerRequestFilter 向请求添加 header:

@Provider
public class MyContainerRequestFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        requestContext.getHeaders().add("header", "value");
    }
}

注意以下几点:

有关 JAX-RS 过滤器的更多详细信息,请查看 Jersey documentation. The JAX-RS filters can be applied globally or can be name-bound 端点子集。

获取 headers 值

在您的 REST 端点中,您可以注入 HttpHeaders:

@Context
HttpHeaders httpHeaders;

然后使用HttpHeaders API得到header值: