【问题标题】:How do I make HttpURLConnection use a proxy?如何让 HttpURLConnection 使用代理?
【发布时间】:2010-11-28 19:28:29
【问题描述】:

如果我这样做......

conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());

打印出来

Proxy? false

问题是,我在代理后面。 JVM 在 Windows 上从哪里获取其代理信息?我该如何设置?我的所有其他应用似乎都对我的代理非常满意。

【问题讨论】:

    标签: java windows http proxy


    【解决方案1】:

    这在互联网上很容易回答。设置系统属性http.proxyHosthttp.proxyPort。您可以使用System.setProperty() 执行此操作,或者使用-D 语法从命令行执行此操作。编辑:根据评论,为 HTTPS 设置 https.proxyPorthttps.proxyHost

    【讨论】:

    • 请编辑您的答案以包含在 https 的场景中。如果您连接到 https 端点,您必须使用 https.proxyHosthttps.proxyPort
    【解决方案2】:

    在打开连接之前设置以下内容,

    System.setProperty("http.proxyHost", "host");
    System.setProperty("http.proxyPort", "port_number");
    

    如果代理需要身份验证,

    System.setProperty("http.proxyUser", "user");
    System.setProperty("http.proxyPassword", "password");
    

    【讨论】:

    【解决方案3】:

    通过两个系统属性支持代理:http.proxyHost 和 http.proxyPort。它们必须分别设置为代理服务器和端口。以下基本示例说明了这一点:

    String url = "http://www.google.com/",
           proxy = "proxy.mydomain.com",
           port = "8080";
    URL server = new URL(url);
    Properties systemProperties = System.getProperties();
    systemProperties.setProperty("http.proxyHost",proxy);
    systemProperties.setProperty("http.proxyPort",port);
    HttpURLConnection connection = (HttpURLConnection)server.openConnection();
    connection.connect();
    InputStream in = connection.getInputStream();
    readResponse(in);
    

    【讨论】:

    • @Pascal 您是否知道使用最新的 Java 方法与 Apache commons-httpclient 相比的主要区别是什么?由于 Java 支持代理和身份验证(正如您在此处提到的 stackoverflow.com/questions/1626549/…),对于简单的情况(例如从公共 HTTP 服务器检索一个文件),没有理由使用 Apache 库。你有什么建议?
    • @dma_k 我同意你的观点,对于像你描述的那样简单的用例,我不会使用第三方库。
    • 你知道如何支持非代理主机吗?我看到我的设备支持它,但不知道如何让我的应用处理它。
    • 但是变量systemProperties没有被connection使用!
    【解决方案4】:

    从 java 1.5 开始,您还可以将 java.net.Proxy 实例传递给 openConnection(proxy) 方法:

    //Proxy instance, proxy ip = 10.0.0.1 with port 8080
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
    conn = new URL(urlString).openConnection(proxy);
    

    如果您的代理需要身份验证,它会给您响应 407。

    在这种情况下,您需要以下代码:

        Authenticator authenticator = new Authenticator() {
    
            public PasswordAuthentication getPasswordAuthentication() {
                return (new PasswordAuthentication("user",
                        "password".toCharArray()));
            }
        };
        Authenticator.setDefault(authenticator);
    

    【讨论】:

    • 能否通过它提供代理用户名和代理密码。
    • 如果不同的代理有不同的用户名/密码对怎么办?调用静态方法设置默认Authenticator并不理想,这比设置sys属性方法好不了多少..
    • Authenticator.default 是一个静态(即全局)变量,所以它只有一次。但请注意,上面的 Authenticator 只是一个小例子。它一次只能处理一个密码。谷歌的例子可以处理不同密码的多个主机。
    • 从 8u11 开始,默认情况下这不适用于基本身份验证,oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes 系统属性必须设置为 emtpty
    • 如果您有域。执行以下操作:new PasswordAuthentication("domainName\\user", "password".toCharArray());
    【解决方案5】:

    你也可以设置

    -Djava.net.useSystemProxies=true
    

    在 Windows 和 Linux 上,这将使用系统设置,因此您无需重复自己 (DRY)

    http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies

    【讨论】:

    • 这仅适用于手动代理服务器配置。自动代理配置和通过脚本配置的代理(尚未)传播到“useSystemProxies”。
    • 在设置 proxyHost 和 proxyPort 时这对我有用。谢谢!
    • 同样,当调用System.setPropertyhttps.proxyHosthttps.proxyPort 出于某种原因没有减少芥末时,这在我的公司代理后面起作用。
    【解决方案6】:

    批准的答案将起作用......如果您知道您的代理主机和端口 =) 。但如果您正在寻找代理主机和端口,以下步骤应该会有所帮助

    如果给出了自动配置的代理:那么

    1> 打开 IE(或任何浏览器)

    2>通过IE->Tools->internet从浏览器获取url地址 选项->连接->局域网设置->获取地址并输入网址,例如:as http://autocache.abc.com/ 并回车,将下载一个文件 .pac 格式,保存到桌面

    3> 在 textpad 中打开 .pac 文件,识别 PROXY:

    在你的编辑器中,它会是这样的:

    返回 "代理 web-proxy.ind.abc.com:8080; 代理 proxy.sgp.abc.com:8080";

    感谢maven in 5 min not workingbekur

    一旦你有了主机和端口,就可以进入这个,你就可以开始了

    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
            URLConnection connection = new URL(url).openConnection(proxy);
    

    【讨论】:

      【解决方案7】:

      对于 Java 1.8 及更高版本,您必须设置 -Djdk.http.auth.tunneling.disabledSchemes= 以使具有基本授权的代理与 https 一起使用。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2021-01-15
      • 2011-06-20
      相关资源
      最近更新 更多