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

时间:2016-01-08 11:25:16

标签: java-ee jax-rs

我正在使用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

我该如何解决?

1 个答案:

答案 0 :(得分:13)

有关如何使用servlet过滤器向请求添加HTTP标头的详细信息,请参阅此question。如果您打算使用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");
    }
}

请注意以下事项:

有关JAX-RS过滤器的更多详细信息,请查看Jersey documentation。 JAX-RS过滤器可以全局应用,也可以name-bound应用于端点子集。

获取标题值

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

@Context
HttpHeaders httpHeaders;

然后使用HttpHeaders API获取标头值: