【问题标题】:Can I set the proxy on the command line when using org.apache.commons.httpclient?使用 org.apache.commons.httpclient 时可以在命令行设置代理吗?
【发布时间】:2011-05-18 11:14:22
【问题描述】:

如果应用程序使用 java.net.* 例程,我可以在调用应用程序时设置代理,如下所示:

java -Dhttp.proxyHost=proxy.server.com -Dhttp.proxyPort=8000 <whatever-the-app-is>

但是,我有一个使用 org.apache.commons.httpclient 进行 http 通信的应用程序(我无法更改)。它没有指定 procxy 服务器,但它使用默认的 HttpConnection。有什么方法可以让命令行中的 apache http 客户端使用代理服务器?

【问题讨论】:

    标签: java http proxy apache-commons


    【解决方案1】:

    我不这么认为。但这是我在一个旧项目中找到的代码,它应该可以工作:

    try {
       String proxyHost = System.getProperty("https.proxyHost");
       int proxyPort = 0;
       try {
            proxyPort = Integer.parseInt(System.getProperty("https.proxyPort"));
       } catch (Exception ex) {
            System.out.println("No proxy port found");
       }
    
       System.setProperty("java.net.useSystemProxies", "true");
    
       ProxySelector ps = ProxySelector.getDefault();
       List<Proxy> proxyList = ps.select(new URI(targetUrl));
       Proxy proxy = proxyList.get(0);
       if (proxy != null) {
             InetSocketAddress addr = ((InetSocketAddress) proxy.address());
             if (addr != null) {
                 proxyHost = addr.getHostName();
                 proxyPort = addr.getPort();
             }
       }
    
       boolean useProxy = proxyHost != null && proxyHost.length() > 0;
    
       if (useProxy) {
             httpClient.getHostConfiguration().setProxy(proxyHost, proxyPort);
       }
    
    } catch (Exception ex) {
       ex.printStackTrace();
    }
    

    【讨论】:

    • 谢谢。不幸的是,我不能(轻松)更改应用程序,但也许我毕竟需要这样做
    【解决方案2】:

    不幸的是,我认为你不能。唯一的方法是应用程序读取 System 属性,然后在 DefaultHttpParams 对象中设置它。

    查看 httpclient-user 组上的this thread 了解更多详情。

    【讨论】:

    • 谢谢。这不是唯一的方法(您可以通过其他方式设置代理,但据我所知,所有这些都涉及更改应用程序)
    【解决方案3】:

    使用 HTTPClient 构建器时,使用 useSystemProperties() 方法启用标准 JVM -D 代理参数。
    http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html#useSystemProperties()

    例子:

    CloseableHttpClient httpclient = HttpClients.custom()
        .useSystemProperties()
        .build();
    

    现在使用 -Dhttp.proxyHost=10.0.0.100 -Dhttp.proxyPort=8800 来配置代理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多