Java 如何在使用Apache http-core-4.3.3开发的反向代理中重写目标URL

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,

我正在使用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, 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,反之亦然