我正在修改 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/