Java代理:如何从HttpRequest中提取目标主机和端口?

时间:2014-01-08 23:04:30

标签: java http proxy

我正在使用java中的Http代理。基本上我有3个应用程序:

  • 客户端应用程序,我只是通过代理向服务器提交请求
  • 捕获请求,修改请求然后将其转发到Web服务器的代理
  • 网络服务器 这是我的客户端代码(摘自apache httpcore示例,但效果很好):

    公共类ClientExecuteProxy(){

    public static void main(String[] args)throws Exception {
        HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");
    
        DefaultHttpClient httpclient = new DefaultHttpClient();
        try {
            httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
    
            HttpHost target = new HttpHost("issues.apache.org", 443, "https");
            HttpGet req = new HttpGet("/");
    
            System.out.println("executing request to " + target + " via " + proxy);
            HttpResponse rsp = httpclient.execute(target, req);
            HttpEntity entity = rsp.getEntity();
    
            System.out.println("----------------------------------------");
            System.out.println(rsp.getStatusLine());
            Header[] headers = rsp.getAllHeaders();
            for (int i = 0; i<headers.length; i++) {
                System.out.println(headers[i]);
            }
            System.out.println("----------------------------------------");
    
            if (entity != null) {
                System.out.println(EntityUtils.toString(entity));
            }
    
        } finally {
            // When HttpClient instance is no longer needed,
            // shut down the connection manager to ensure
            // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        }
    }
    

    }

如果我直接执行对服务器的请求(如果我注释行“httpclient.getParams()。setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);”),它的工作没有任何问题。但如果我这样离开它,它将通过代理。以下是我不知道如何处理代理的部分: 代理侦听请求,读取其内容并验证它是否遵守某些策略。如果确定它将转发到服务器,否则它将丢弃请求,它将发送带有错误的HttpResponse。问题是请求是否正常并且需要转发。代理如何知道转发它的地址?我的问题是:如何从“HttpHost target = new HttpHost”(issues.apache.org“,443,”https“)行中输入的请求中获取信息;”?     我用谷歌搜索了几个小时但没有发现任何东西。请有人帮帮我吗?

1 个答案:

答案 0 :(得分:0)

为应用程序或浏览器定义HTTP代理时,可以:

  1. 将有一个前面的CONNECT请求形成一个隧道,告诉你目标主机:端口,或

  2. 整个目标网址位于GET / POST / ...请求行的中间。通常,没有代理,这只是相对于TCP连接的host:port的相对URL。