Java 代理servlet挂起在HttpClient.execute()上

Java 代理servlet挂起在HttpClient.execute()上,java,proxy,apache-httpclient-4.x,Java,Proxy,Apache Httpclient 4.x,我需要编写一个servlet,它基本上只是将每个传入请求代理到不同主机上的相同URL路径。下面是我使用Apache Commons Http Client 4.1.3的想法: @WebServlet("/data/*") public class ProxyServlet extends HttpServlet { protected void doGet (HttpServletRequest request, HttpServletResponse response) throws

我需要编写一个servlet,它基本上只是将每个传入请求代理到不同主机上的相同URL路径。下面是我使用Apache Commons Http Client 4.1.3的想法:

@WebServlet("/data/*")
public class ProxyServlet extends HttpServlet {

  protected void doGet (HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
    HttpClient client = new DefaultHttpClient();
    try {
      String url = getMappedServiceUrlFromRequest(request);
      HttpGet get = new HttpGet(url);
      copyRequestHeaders(request, get);

      HttpResponse getResp = client.execute(get);
      response.setStatus(getResp.getStatusLine().getStatusCode());
      copyResponseHeaders(getResp, response);

      HttpEntity entity = getResp.getEntity();
      if (entity != null) {
        OutputStream os = response.getOutputStream();
        try {
          entity.writeTo(os);
        } finally {
          try { os.close(); } catch (Exception ignored) { }
        }
      }
    } catch (Exception e) {
      throw new ServletException(e);
    } finally {
      client.getConnectionManager().shutdown();
    }
  }

  private void getMappedServiceUrlFromRequest (...)
  private void copyResponseHeaders (...)
  private void copyRequestHeaders (...)
}
这在第一次调用servlet时就可以正常工作。但是,在第一次之后,servlet挂起在client.execute(get)行上

Google上有很多关于“HttpClient执行挂起”的点击,其中大多数建议使用ThreadSafeClientConnManager实例。我试过了,可惜没用


我已经花了好几个小时在谷歌上搜索这个问题,但还没有找到任何可以解决这个问题的方法。如果有人能指点我在这里做错了什么,我将不胜感激。

我建议你用艰难的方式来做这件事。只需编写一个执行重定向的过滤器


或者甚至只是一个TCP服务器,它在端口侦听并来回复制字节。您根本不需要在代理中使用HTTP协议,除非您正在实现CONNECT命令,在这种情况下,这是您需要了解的唯一HTTP部分,它的回复是您需要了解的唯一HTTP响应。其他一切都是字节。

您是否尝试在org.apache.http中启用调试日志记录?这将是我的第一步。类似的帖子值得一读: