Java 如何在使用Apache http-core-4.3.3开发的反向代理中重写目标URL
我正在使用http-core-4.3.3开发一个反向代理,例如,我需要重写url /srv001/curstomer/id必须重写为/curstomer/id 我的开发基于这个示例 这是我的代理处理程序Java 如何在使用Apache http-core-4.3.3开发的反向代理中重写目标URL,java,reverse-proxy,apache-httpcomponents,Java,Reverse Proxy,Apache Httpcomponents,我正在使用http-core-4.3.3开发一个反向代理,例如,我需要重写url /srv001/curstomer/id必须重写为/curstomer/id 我的开发基于这个示例 这是我的代理处理程序 public void handle( final HttpRequest request, final HttpResponse response, final HttpContext context) throws HttpException,
public void handle(
final HttpRequest request,
final HttpResponse response,
final HttpContext context) throws HttpException, IOException {
long start = System.currentTimeMillis();
DefaultBHttpClientConnection outconn = (DefaultBHttpClientConnection) context.getAttribute(ProxyContext.HTTP_OUT_CONN);
context.setAttribute(HttpCoreContext.HTTP_CONNECTION, outconn);
context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, this.target);
System.out.println(">> Request URI: " + request.getRequestLine().getUri());
// Remove hop-by-hop headers
...
this.httpexecutor.preProcess(request, this.httpproc, context);
final HttpResponse targetResponse = this.httpexecutor.execute(request, outconn, context);
this.httpexecutor.postProcess(response, this.httpproc, context);
// Remove hop-by-hop headers
...
response.setStatusLine(targetResponse.getStatusLine());
response.setHeaders(targetResponse.getAllHeaders());
response.setEntity(targetResponse.getEntity());
System.out.println("<< Response: " + response.getStatusLine());
final boolean keepalive = this.connStrategy.keepAlive(response, context);
context.setAttribute(ProxyContext.HTTP_CONN_KEEPALIVE, new Boolean(keepalive));
long end = System.currentTimeMillis();
System.out.println("-- request took (msec): " + Long.toString(end - start));
}
公共无效句柄(
最终HttpRequest请求,
最终HttpResponse响应,
最终HttpContext上下文)引发HttpException,IOException{
长启动=System.currentTimeMillis();
DefaultBHTTPClientConnectionOutConn=(DefaultBHttpClientConnection)context.getAttribute(ProxyContext.HTTP_OUT_CONN);
setAttribute(HttpCoreContext.HTTP_连接,outconn);
setAttribute(HttpCoreContext.HTTP_TARGET_HOST,this.TARGET);
System.out.println(“>>请求URI:”+Request.getRequestLine().getUri());
//删除逐跳标头
...
this.httpexecutor.preProcess(请求,this.httpproc,上下文);
final-HttpResponse-targetResponse=this.httpexecutor.execute(请求、输出连接、上下文);
this.httpexecutor.postProcess(响应,this.httpproc,上下文);
//删除逐跳标头
...
response.setStatusLine(targetResponse.getStatusLine());
response.setHeaders(targetResponse.getAllHeaders());
response.setEntity(targetResponse.getEntity());
System.out.println(“HttpRequest和HttpResponse对象非常便宜。当使用HttpCore实现代理时,您应该始终复制传入消息,而不是传递同一对象,原因如下:
- URI重写是其中之一
- 处理所谓的逐跳标头是另一个问题
- 协议升级/降级,例如客户端支持HTTP/1.0,而源站支持HTTP/1.1,反之亦然