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

时间:2012-04-14 19:59:06

标签: 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 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的实例。试了一下,遗憾地没有帮助。

我花了几个小时在谷歌搜索问题,但我还没有发现任何修复它的东西。对于我在这里做错了什么,我真的很感激。

1 个答案:

答案 0 :(得分:0)

我建议你这样做很难。只需编写一个执行重定向的过滤器

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