How do I make HttpURLConnection use a proxy?

294,279

Solution 1

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

Solution 2

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.

Solution 3

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

Solution 4

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

Solution 5

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");
Share:
294,279

Related videos on Youtube

izb
Author by

izb

Twitter: http://twitter.com/izb

Updated on September 04, 2021

Comments

  • izb
    izb over 2 years

    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.

  • Jameel Moideen
    Jameel Moideen over 14 years
    I actually think "http.proxyUser" and "http.proxyPassword" are not supported anymore. See stackoverflow.com/questions/120797/… for more details.
  • dma_k
    dma_k about 14 years
    @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?
  • Devanshu Mevada
    Devanshu Mevada about 14 years
    @dma_k I agree with you, for simple use cases like the one you described I wouldn't use a third party library.
  • Xolve
    Xolve almost 14 years
    can we provide proxy username and proxy password through it.
  • Chris Noe
    Chris Noe almost 11 years
    Exactly what I was looking. And yet I accidentally clicked downvote while copy/pasting, only to notice too late to undo it. Sorry.
  • Tires
    Tires almost 10 years
    This works only with manual proxy server configuration. Automatic proxy configuration and proxies configured through script are not (yet) propagated to "useSystemProxies".
  • nrobey
    nrobey about 9 years
    This worked for me when setting the proxyHost and proxyPort didn't. Thanks!
  • javaPhobic
    javaPhobic about 9 years
    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..
  • Hanzo
    Hanzo about 8 years
    I'm trying to use this to check connection with google.com but getResponseCode() returns recvfrom failed: ECONNRESET (Connection reset by peer) exception. ¿what would be wrong?
  • cecemel
    cecemel almost 8 years
    Do we have to call Authenticator every time we open a HttpURLConnection? Or set this only once?
  • RiRomain
    RiRomain over 7 years
    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.
  • Stroboskop
    Stroboskop over 7 years
    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.
  • white
    white over 7 years
    Since 8u11 this will not work by default with Basic authentication, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.ht‌​ml jdk.http.auth.tunneling.disabledSchemes system property must be set to emtpty
  • Developer Marius Žilėnas
    Developer Marius Žilėnas over 7 years
    In case you have domain. Do as following: new PasswordAuthentication("domainName\\user", "password".toCharArray());
  • U880D
    U880D about 6 years
    Background information about this is discussed at stackoverflow.com/questions/41806422/…
  • parsecer
    parsecer about 5 years
    But variable systemProperties is not used by the connection!
  • Pradeep hebbar
    Pradeep hebbar almost 5 years
    @NickDK, Your answer is very good and easy to understand, I was looking for the same piece of code, but I am getting " java.net.SocketTimeoutException: connect timed out " while establishing the connecting. Can someone please guide me
  • Chris
    Chris almost 5 years
    for multiple proxies, instead of using an Authenticator like in the example, just setting the 'Proxy-Authorization' header is enough, but may not always fit your requirements, for details see: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
  • Pavel Komarov
    Pavel Komarov over 4 years
    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.
  • garnet
    garnet about 4 years
    @Chris, I would like to clarify your statement: "just setting the 'Proxy-Authorization'" & , "but may not always fit your requirements". If proxy requires NTLM authentication other than Basic authentication, setting 'Proxy-Authorization' will not be as simple as in case of Basic auth.
  • blacktide
    blacktide almost 4 years
    The Authenticator part resolved the issue for me using the okhttp3 library as well using a SOCKS5 proxy.
  • Cristian Balint
    Cristian Balint over 2 years
    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.