How do I make HttpURLConnection use a proxy?
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");
Related videos on Youtube
Comments
-
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 over 14 yearsI actually think "http.proxyUser" and "http.proxyPassword" are not supported anymore. See stackoverflow.com/questions/120797/… for more details.
-
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 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 almost 14 yearscan we provide proxy username and proxy password through it.
-
Chris Noe almost 11 yearsExactly what I was looking. And yet I accidentally clicked downvote while copy/pasting, only to notice too late to undo it. Sorry.
-
Tires almost 10 yearsThis works only with manual proxy server configuration. Automatic proxy configuration and proxies configured through script are not (yet) propagated to "useSystemProxies".
-
nrobey about 9 yearsThis worked for me when setting the proxyHost and proxyPort didn't. Thanks!
-
javaPhobic about 9 yearsWhat 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 about 8 yearsI'm trying to use this to check connection with google.com but
getResponseCode()
returnsrecvfrom failed: ECONNRESET (Connection reset by peer)
exception. ¿what would be wrong? -
cecemel almost 8 yearsDo we have to call Authenticator every time we open a HttpURLConnection? Or set this only once?
-
RiRomain over 7 yearsDo 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 over 7 yearsAuthenticator.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 over 7 yearsSince 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
-
Developer Marius Žilėnas over 7 yearsIn case you have domain. Do as following:
new PasswordAuthentication("domainName\\user", "password".toCharArray());
-
U880D about 6 yearsBackground information about this is discussed at stackoverflow.com/questions/41806422/…
-
parsecer about 5 yearsBut variable
systemProperties
is not used by theconnection
! -
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 almost 5 yearsfor 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 over 4 yearsLikewise, this worked from behind my company proxy when calls to
System.setProperty
for thehttps.proxyHost
andhttps.proxyPort
for some reason weren't cutting the mustard. -
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 almost 4 yearsThe
Authenticator
part resolved the issue for me using the okhttp3 library as well using a SOCKS5 proxy. -
Cristian Balint over 2 yearsPlease 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.