我正在通过添加单个标头来修改HttpRequest我WebFilter的request使用HttpServletRequestWrapper实现类:
HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(request);
requestWrapper.addHeader(OAuth.OAUTH_ACCESS_TOKEN, accessTokenWord);
chain.doFilter(requestWrapper, response);
Run Code Online (Sandbox Code Playgroud)
后doFilter(requestWrapper, response)进行,JAX-RS导致请求到它的资源,其具有@RequestScoped字段:
@Inject
protected HttpServletRequest request;
Run Code Online (Sandbox Code Playgroud)
但是,它不包含任何预期的标头:
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
所以,this.request.getHeader(OAuth.OAUTH_ACCESS_TOKEN)是的null.
我怎么解决这个问题?
cas*_*lin 14
有关如何使用servlet过滤器将HTTP标头添加到请求的详细信息,请参阅此问题.如果您打算使用JAX-RS过滤器,请继续阅读.
使用JAX-RS后,最好使用ContainerRequestFilter以下内容为请求添加标头:
@Provider
public class MyContainerRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.getHeaders().add("header", "value");
}
}
Run Code Online (Sandbox Code Playgroud)
请注意以下事项:
所述ContainerRequestContext#getHeaders()返回一个可变多值图,其包含请求报头.
该@Provider注释标记的扩展接口期间提供扫描阶段,应该是由JAX-RS运行时发现的实现.
有关JAX-RS过滤器的更多详细信息,请查看Jersey文档.JAX-RS过滤器可以全局应用,也可以与端点子集绑定名称.
在REST端点中,您可以注入HttpHeaders:
@Context
HttpHeaders httpHeaders;
Run Code Online (Sandbox Code Playgroud)
然后使用HttpHeadersAPI获取标头值:
HttpHeaders#getHeaderString(String)HttpHeaders#getRequestHeaders()HttpHeaders#getHeaderString(String)| 归档时间: |
|
| 查看次数: |
7884 次 |
| 最近记录: |