我需要编写一个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的实例。试了一下,遗憾地没有帮助。
我花了几个小时在谷歌搜索问题,但我还没有发现任何修复它的东西。对于我在这里做错了什么,我真的很感激。
答案 0 :(得分:0)
我建议你这样做很难。只需编写一个执行重定向的过滤器。
甚至只是一个侦听端口的TCP服务器,只是来回复制字节。除非您正在实施CONNECT命令,否则您根本不需要在代理中使用HTTP协议,在这种情况下,这是您需要了解的唯一HTTP,并且其回复是您需要了解的唯一HTTP响应。其他一切都只是字节。