Java 代理servlet挂起在HttpClient.execute()上
我需要编写一个servlet,它基本上只是将每个传入请求代理到不同主机上的相同URL路径。下面是我使用Apache Commons Http Client 4.1.3的想法: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
@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中启用调试日志记录?这将是我的第一步。类似的帖子值得一读: