如何让HttpURLConnection使用代理?

izb*_*izb 128 java windows proxy http

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

conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());
Run Code Online (Sandbox Code Playgroud)

它打印

Proxy? false
Run Code Online (Sandbox Code Playgroud)

问题是,我支持代理.JVM从哪里获取Windows上的代理信息?我该如何设置?我的所有其他应用程序似乎对我的代理非常满意.

Nic*_*kDK 322

从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);
Run Code Online (Sandbox Code Playgroud)

如果您的代理需要身份验证,它将为您提供响应407.

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

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);
Run Code Online (Sandbox Code Playgroud)

  • 如果您为不同的代理服务器使用不同的用户名/密码对,该怎么办?调用静态方法来设置默认的Authenticator并不理想,这并不比设置sys属性方法好多少. (13认同)
  • 我们可以通过它提供代理用户名和代理密码吗? (7认同)
  • 如果您有域名.请执行以下操作:`new PasswordAuthentication("domainName \\ user","password".toCharArray());` (3认同)
  • Authenticator.default 是一个静态(即全局)变量,所以它只有一次。但请注意,上面的 Authenticator 只是一个最小的例子。它一次只能处理一个密码。谷歌的例子可以处理具有不同密码的多个主机。 (2认同)
  • 由于8u11在默认情况下无法使用基本身份验证,因此必须将http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes系统属性设置为空虚 (2认同)
  • 对于多个代理,不要像示例中那样使用身份验证器,只需设置“代理授权”标头就足够了,但可能并不总是符合您的要求,有关详细信息,请参阅:https://developer.mozilla.org/en- US/docs/Web/HTTP/Headers/代理授权 (2认同)

Sea*_*wen 33

这很容易从互联网上回答.设置系统属性http.proxyHosthttp.proxyPort.您可以System.setProperty()使用-D语法执行此操作,也可以从命令行执行此操作.


Pas*_*ent 19

通过两个系统属性支持代理: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);
Run Code Online (Sandbox Code Playgroud)


Dan*_*art 11

你也可以设置

-Djava.net.useSystemProxies=true
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这仅适用于手动代理服务器配置.通过脚本配置的自动代理配置和代理尚未(传播)传播到"useSystemProxies". (6认同)
  • 当设置 proxyHost 而 proxyPort 没有时,这对我有用。谢谢! (2认同)

ZZ *_*der 10

在openConnection之前设置以下内容,

System.setProperty("http.proxyHost", "host");
System.setProperty("http.proxyPort", "port_number");
Run Code Online (Sandbox Code Playgroud)

如果代理需要身份验证

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
Run Code Online (Sandbox Code Playgroud)

  • 我实际上认为不再支持"http.proxyUser"和"http.proxyPassword".有关详细信息,请参阅http://stackoverflow.com/questions/120797/how-do-i-set-the-proxy-to-be-used-by-the-jvm. (7认同)

Ant*_*ton 5

对于Java 1.8及更高版本,您必须设置-Djdk.http.auth.tunneling.disabledSchemes=使用https进行基本授权的代理.