如何使用 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");
}
}
注意以下几点:
ContainerRequestContext#getHeaders()
returns一个可变多值映射,其中包含请求headers.
@Provider
注释标记了一个扩展接口的实现,在提供者扫描阶段应该被 JAX-RS 运行时发现。
有关 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值:
我正在修改 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");
}
}
注意以下几点:
ContainerRequestContext#getHeaders()
returns一个可变多值映射,其中包含请求headers.@Provider
注释标记了一个扩展接口的实现,在提供者扫描阶段应该被 JAX-RS 运行时发现。
有关 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值: