如何在JAX-RS中使用过滤器向HTTP请求添加标头? [英] How to add a header to HTTP request using a filter in JAX-RS?

查看:113
本文介绍了如何在JAX-RS中使用过滤器向HTTP请求添加标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在通过使用HttpServletRequestWrapper实现类将单个标头添加到request来修改WebFilter上的HttpRequest:

I'm modifying aHttpRequest on my WebFilter by adding a single header to request using a HttpServletRequestWrapper implementation class:

HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(request);
requestWrapper.addHeader(OAuth.OAUTH_ACCESS_TOKEN, accessTokenWord);
chain.doFilter(requestWrapper, response);

执行doFilter(requestWrapper, response)后,JAX-RS将请求引向其资源,该资源具有一个@RequestScoped字段:

After doFilter(requestWrapper, response) is performed, JAX-RS leads request to its resource, which has a @RequestScoped field:

@Inject
protected HttpServletRequest request;

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

However, it doesn't contain any expected 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标头添加到请求中.如果您打算使用JAX-RS过滤器,请继续阅读.

Refer to this question for details on how to add HTTP headers to the request using a servlet filter. If you intend to use a JAX-RS filter, keep reading.

使用JAX-RS后,最好使用

Once you are working with JAX-RS, you'd better using a ContainerRequestFilter like the following to add a header to the request:

@Provider
public class MyContainerRequestFilter implements ContainerRequestFilter {

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

请遵守以下条件:

@Provider 注释标记了扩展接口的实现,该扩展接口应在提供者扫描阶段由JAX-RS运行时发现.

The @Provider annotation marks an implementation of an extension interface that should be discoverable by JAX-RS runtime during a provider scanning phase.

有关JAX-RS过滤器的更多详细信息,请查看 名称绑定 到端点的子集.

For more details about JAX-RS filters, have a look at the Jersey documentation. The JAX-RS filters can be applied globally or can be name-bound to a subset of endpoints.

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

In your REST endpoints, you can inject HttpHeaders:

@Context
HttpHeaders httpHeaders;

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

Then use the HttpHeaders API to get the header values:

登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆