ChatGPT解决这个技术问题 Extra ChatGPT

How do I make HttpURLConnection use a proxy?

If I do this...

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

it prints

Proxy? false

The problem is, I am behind a proxy. Where does the JVM get its proxy information from on Windows? How do I set this up? All my other apps seem perfectly happy with my proxy.


W
Will

Since java 1.5 you can also pass a java.net.Proxy instance to the openConnection(proxy) method:

//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);

If your proxy requires authentication it will give you response 407.

In this case you'll need the following code:

    Authenticator authenticator = new Authenticator() {

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

can we provide proxy username and proxy password through it.
What if you have different username/password pairs for the different proxies? Calling a static method to set the default Authenticator isn't ideal, this is not much better than setting the sys properties method..
Authenticator.default is a static (i.e. global) variable, so it's only once. But please note that the Authenticator above is just a minimal example. It can only handle one password at a time. Google for examples that can handle multiple hosts with different passwords.
Since 8u11 this will not work by default with Basic authentication, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes system property must be set to emtpty
In case you have domain. Do as following: new PasswordAuthentication("domainName\\user", "password".toCharArray());
S
Sean Owen

This is fairly easy to answer from the internet. Set system properties http.proxyHost and http.proxyPort. You can do this with System.setProperty(), or from the command line with the -D syntax. EDIT: per comment, set https.proxyPort and https.proxyHost for HTTPS.


Please edit your answer to include for the scenario when it's https. If you connect to a https endpoint you have to use https.proxyHost and https.proxyPort.
P
Pascal Thivent

Proxies are supported through two system properties: http.proxyHost and http.proxyPort. They must be set to the proxy server and port respectively. The following basic example illustrates it:

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 Do you happen to know what are the major differences of using latest Java approach in comparison to Apache commons-httpclient? As Java supports proxying and authentication (as you mentioned here stackoverflow.com/questions/1626549/…), for simple cases (like retrieve one file from public HTTP server) there is no reason to use Apache library. What is your recommendation?
@dma_k I agree with you, for simple use cases like the one you described I wouldn't use a third party library.
Do you know how to support the nonProxyHosts? I see that my device support it but doesn't know how to make my app handle it.
But variable systemProperties is not used by the connection!
D
Daniel Worthington-Bodart

You can also set

-Djava.net.useSystemProxies=true

On Windows and Linux this will use the system settings so you don't need to repeat yourself (DRY)

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


This works only with manual proxy server configuration. Automatic proxy configuration and proxies configured through script are not (yet) propagated to "useSystemProxies".
This worked for me when setting the proxyHost and proxyPort didn't. Thanks!
Likewise, this worked from behind my company proxy when calls to System.setProperty for the https.proxyHost and https.proxyPort for some reason weren't cutting the mustard.
Z
ZZ Coder

Set following before you openConnection,

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

If proxy requires authentication,

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

I actually think "http.proxyUser" and "http.proxyPassword" are not supported anymore. See stackoverflow.com/questions/120797/… for more details.
A
Anton

For Java 1.8 and higher you must set -Djdk.http.auth.tunneling.disabledSchemes= to make proxies with Basic Authorization working with https.


Background information about this is discussed at stackoverflow.com/questions/41806422/…
C
Community

The approved answer will work ... if you know your proxy host and port =) . But in case you are looking for the proxy host and port the steps below should help

if auto configured proxy is given: then 1> open IE(or any browser) 2> get the url address from your browser through IE->Tools->internet option->connections->LAN Settings-> get address and give in url eg: as http://autocache.abc.com/ and enter, a file will be downloaded with .pac format, save to desktop 3> open .pac file in textpad, identify PROXY: In your editor, it will come something like: return "PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";

kudos to bekur from maven in 5 min not working

Once you have the host and port just pop in into this and your good to go

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