我们正在对我们的REST服务运行安全检查,并注意到如果设置了Host
标头,它将覆盖原始服务器/主机,这会导致我们返回的URL使用该主机而不是服务器。 / p>
使用Fiddler我可以重新创建问题,因为它考虑了与浏览器不同的Host
标头。此处显示的请求包含3个Host
标头(用于测试目的):http://i.imgur.com/zrQhLOV.png
因此,我们的回复网址使用的是test2.com
主机,而不是所需的localhost
。
我们在web.xml
中定义了一系列过滤器来修改请求,但请求中列出的服务器仍然指向错误的主机。
我尝试实现PreProcessInterceptor
认为我可以捕获请求并修改Host
标头。拦截器的实现方式如下:
@Provider
@ServerInterceptor
@Precedence("HEADER_DECORATOR")
public class PreProcessContextInterceptor implements PreProcessInterceptor {
HttpRequest request;
@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethod method)
throws Failure, WebApplicationException {
this.request = request;
return null;
}
}
在声明所有过滤器之前,它已在web.xml
中注册:
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.package.ws.PreProcessContextInterceptor</param-value>
</context-param>
然而,问题是拦截器在我们的第一个过滤器被击中后,请求仍然有错误的主机设置。
有关如何解决此问题或在RestEASY中查看哪个方向的任何建议?
JAX-RS是否可以设置最终的Host
标题,或者这可能发生在RestEASY中?
感谢。
答案 0 :(得分:0)
一个简单的解决方法是使用RequestFilter,也可以在进入休息控制器之前检查主机值:
/**
* Servlet Filter implementation class MyRequestFilter
*/
@WebFilter("/*")
public class MyRequestFilter implements Filter {
/**
* Default constructor.
*/
public MyRequestFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
assert request instanceof HttpServletRequest;
HttpServletRequest req = (HttpServletRequest) request;
String host = req.getHeader("host");
System.err.println(host);
// pass the request along the filter chain
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}