RestEASY主机标头被覆盖

时间:2015-09-22 21:43:53

标签: java rest resteasy

我们正在对我们的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中?

感谢。

1 个答案:

答案 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
    }

}