jakarta-ee - 如何使用 JAX-RS 中的过滤器向 HTTP 请求添加 header ?

标签 jakarta-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 field :
@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 .

我该如何解决?

最佳答案

引用这个question有关如何使用 servlet 过滤器将 HTTP header 添加到请求的详细信息。如果您打算使用 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");
    }
}

请注意以下事项:
  • ContainerRequestContext#getHeaders() 返回包含请求 header 的可变多值映射。
  • @Provider 注释标记了扩展接口(interface)的实现,在提供者扫描阶段应该可以被 JAX-RS 运行时发现。

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

    获取标题值

    在您的 REST 端点中,您可以注入(inject) HttpHeaders :
    @Context
    HttpHeaders httpHeaders;
    

    然后使用 HttpHeaders API获取标题值:
  • HttpHeaders#getHeaderString(String)
  • HttpHeaders#getRequestHeaders()
  • HttpHeaders#getHeaderString(String)
  • 关于jakarta-ee - 如何使用 JAX-RS 中的过滤器向 HTTP 请求添加 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34675933/

    相关文章:

    java - 如何在 Java EE 中运行并行进程

    java - JAX-RS - 同步和线程

    java - Jersey 2 - 从资源方法返回客户端的响应

    json - 使用 JSON 和 Wink 的 JAX-RS 客户端/服务器应用程序

    java - 如何使用 Grizzly 在相同的基本 url 上提供静态内容和资源

    jsf - 如何编写和配置自定义 facelet 以覆盖 h :messages?

    java - JBoss Richfaces : How to provide a different validation message to rich:calendar from within the xhtml implementation?

    java - 如何使用java计算远程机器的磁盘空间?

    java - 丰富 :dataScroller does not refresh rich:dataTable in JSF

    java - org.glassfish.jersey.client.ClientProperties 超时在 WildFly 上不起作用