I did see the question about setting the proxy for the JVM but what I want to ask is how one can utilize the proxy that is already configured (on Windows).
Here is a
It is possible to detect the proxy using the ProxySelector class and assign the system proxy by assigning environment variables with the setProperty method of the System class:
System.setProperty("java.net.useSystemProxies", "true");
System.out.println("detecting proxies");
List l = null;
try {
l = ProxySelector.getDefault().select(new URI("http://foo/bar"));
}
catch (URISyntaxException e) {
e.printStackTrace();
}
if (l != null) {
for (Iterator iter = l.iterator(); iter.hasNext();) {
java.net.Proxy proxy = (java.net.Proxy) iter.next();
System.out.println("proxy type: " + proxy.type());
InetSocketAddress addr = (InetSocketAddress) proxy.address();
if (addr == null) {
System.out.println("No Proxy");
} else {
System.out.println("proxy hostname: " + addr.getHostName());
System.setProperty("http.proxyHost", addr.getHostName());
System.out.println("proxy port: " + addr.getPort());
System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));
}
}
}
UPDATE: you need to have the System Property java.net.useSystemProxies set to true for my solution below to work.
If you use java.net.URL.openStream()
to get an InputStream
for the web resource content you automatically get the same proxy used as Internet Explorer would use for that URL.
No need to go to the Java Control Panel or to display the proxy used.
This might be a little late, but I ran into the same problem. The way I fixed it is by adding the following system property:
-Djava.net.useSystemProxies=true
Now, note that this property is set only once at startup, so it can't change when you run your application. From https://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies:
java.net.useSystemProxies (default: false) ... Note that this property is checked only once at startup.
try{
System.setProperty("java.net.useSystemProxies", "true");
String prx = ProxySelector.getDefault().select(new URI("http://www.google.com")).get(0).address().toString();
JOptionPane.showMessageDialog(null, prx);
} catch(Exception e){
JOptionPane.showMessageDialog(null, "no proxy");
}
I found an odd behavior experimenting with the suggested code here.
It appears that, after a default ProxySelector has been set, regular socket code (e.g. creating a new Socket) does not work anymore, because it tries to use a socks server (not sure why it would do this, but for me it does).
So if you, when calling
Socket socket = new Socket(host, port);
you receive such a SocketException:
java.net.SocketException: Malformed reply from SOCKS server
at java.net.SocksSocketImpl.readSocksReply(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
then try setting the default ProxySelector back to null:
ProxySelector.setDefault(null);
For me this resulted in the following small Java class which I now use to simply retrieve the systems proxy settings without having it affect the further usage of Sockets() of the application, yet configuring the system properly to use the proxy:
public class ProxyConfig {
private static String host;
private static int port;
public static void init() {
System.setProperty("java.net.useSystemProxies", "true");
Proxy proxy = getProxy();
if (proxy != null) {
InetSocketAddress addr = (InetSocketAddress) proxy.address();
host = addr.getHostName();
port = addr.getPort();
System.setProperty("java.net.useSystemProxies", "false");
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxyPort", ""+port);
}
System.setProperty("java.net.useSystemProxies", "false");
}
public static String getHost() {
return host;
}
public static int getPort() {
return port;
}
private static Proxy getProxy() {
List<Proxy> l = null;
try {
ProxySelector def = ProxySelector.getDefault();
l = def.select(new URI("http://foo/bar"));
ProxySelector.setDefault(null);
} catch (Exception e) {
e.printStackTrace();
}
if (l != null) {
for (Iterator<Proxy> iter = l.iterator(); iter.hasNext();) {
java.net.Proxy proxy = iter.next();
return proxy;
}
}
return null;
}
}
java.net.URL.openStream()
is a shorthand for java.net.URL.openConnection().getInputStream()
.