【问题标题】:Without changing code, how to force httpClient to use proxy by environment variables or JVM arguments在不更改代码的情况下,如何通过环境变量或 JVM 参数强制 httpClient 使用代理
【发布时间】:2011-03-02 08:37:15
【问题描述】:

我发现这些系统设置http.proxyHosthttp.proxyPort 对httpClient 没有用。如何通过环境变量或VM参数或类似的东西强制httpClient使用代理而不更改代码?

【问题讨论】:

  • 你找到解决这个问题的方法了吗?我面临同样的问题,第三方库(azure-keyvault-java-sdk)使用自己的 httpClient,我无法强制它使用代理。实际的 http 调用是在新的 Executor 线程中进行的,这也不允许我在调用线程中设置 ProxySelector。有什么解决办法吗?
  • 我们有同样的问题,我们希望在不更改代码的情况下执行此操作,即使配置更改也被视为代码更改,因为我们需要发布新的部署来执行此操作。我们的结论是无法使用 JVM 命令行选项覆盖客户端的配置,您只需更改客户端的配置并发布新版本即可。

标签: java apache-commons-httpclient


【解决方案1】:

【讨论】:

【解决方案2】:

HTTP 客户端(我的情况是 v 4.5.1)可以像这样使用系统代理:

HttpClient httpClient = HttpClientBuilder.create().useSystemProperties().build();
//or 
HttpClient httpClient = HttpClients.createSystem();

【讨论】:

  • 没错,你可以像这样使用系统属性。不要忘记,要连接到 https://... url,您必须使用 https.proxyHost 等属性。我这边的一个类似问题的详细回答:stackoverflow.com/questions/30630330/…
【解决方案3】:

您可以使用client.getHostConfiguration().setProxy(host, port) 方法自行强制代理到HttpClient。我通常围绕HttpClient 创建包装类,并且在初始化此类时,我从任何来源(环境变量...)设置代理。

在您无法直接在HttpClient 上设置代理的情况下,我使用了java.net.ProxySelector.setDefault(new MyProxySelector())。您必须实现自己的 ProxySelector 类,并且方法 select 根据请求的 URI 进行代理选择。您可以进行 url->proxy 映射,将特定的 URI 地址配置为所需的代理,或为所有请求的 URI 全局返回一个代理。

正如我在 HttpClient 源代码中看到的,没有其他方法可以配置代理,只有 setProxy 方法。我正在使用 commons-httpclient-3.1。

【讨论】:

  • @user496949 你能在HttpClient 周围创建包装类并始终以你的方式初始化它吗?
  • 说,我有一个第三方库,它在里面使用 httpclient 来获取一些东西。这种情况该如何处理?
  • 在这种情况下,我使用了java.net.ProxySelector.setDefault(new MyProxySelector());。您必须实现自己的 ProxySelector 类和方法 select 根据请求的 URI 进行代理选择(进行 urlproxy 映射以将特定的 URL 地址配置到所需的代理)。正如我在HttpClient 源代码中看到的那样,没有其他方法可以配置代理甚至 setProxy 方法。我正在使用 commons-httpclient-3.1。
【解决方案4】:

AFAIK,如果不更改代码,您将无法管理此问题,但您可以通过使用自己的连接管理器来更接近本机行为。见ProxySelector changes URL's scheme from https:// to socket://

【讨论】:

    【解决方案5】:

    这有帮助吗?

    System.setProperty("https.proxyHost", proxy_host);
    System.setProperty("http.proxyHost", proxy_host);
    System.setProperty("https.proxyPort", proxy_port);
    System.setProperty("http.proxyPort", proxy_port);
    

    当然你也可以通过命令行传递相同的属性

    【讨论】:

    • 不幸的是,这不适用于 httpclient,这是我的问题
    • 问题清楚地表明这些变量不起作用。
    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2021-09-20
    • 2010-12-31
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多