如何使用JAX-RS中的过滤器向HTTP请求添加标头



我正在修改WebFilter上的HttpRequest,方法是使用HttpServletRequestWrapper实现类向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;

然而,它不包含任何预期的标题:

@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过滤器

使用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)

最新更新