将JVM / JRE设置为自动使用Windows代理

我看到了有关为JVM设置代理的问题,但是我想问的是如何使用已经configuration的代理(在Windows上)。

这是我的问题的一个示范:

  1. 转到您的控制面板 – > Java并设置一个代理地址。
  2. 运行以下简单的小程序代码(我正在使用Eclipse IDE):
import java.awt.Graphics; import javax.swing.JApplet; import java.util.*; public class Stacklet extends JApplet { private String message; public void init(){ Properties props = System.getProperties(); message = props.getProperty("http.proxyHost", "NONE"); message = (message.length() == 0)? "NONE": message; } public void paint(Graphics g) { g.drawString(message, 20, 20); } } 

Applet显示“NONE”而不考虑您在Java控制面板中的设置。 如果Windows代理设置(通常在Internet Explorer中设置)是我可以确定的,但是在Java控制面板中执行额外的configuration步骤仍然是可以接受的解决scheme,那么最好是什么。

谢谢!

可以使用ProxySelector类来检测代理,并通过使用System类的setProperty方法分配环境variables来分配系统代理:

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

我在这里发现了一个奇怪的行为,试验了build议的代码。

看起来CodeGo.net,默认的ProxySelector设置后,定期套接字代码(例如创build一个新的套接字)不再工作,因为它试图使用袜子服务器(不知道为什么它会这样做,但对我来说) 。

所以,如果你打电话

 Socket socket = new Socket(host, port); 

你会收到这样一个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) 

然后尝试将默认的ProxySelector设置回null:

 ProxySelector.setDefault(null); 

对于我来说,这导致了下面的小Java类,我现在使用它来简单地检索系统代理设置,而不会影响应用程序的Sockets()的进一步使用,但正确地configuration系统以使用代理:

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

这可能有点晚,但我遇到了同样的问题。 我修正它的方式是使用-Djava.net.useSystemProxies = true作为jvm参数。

“请注意,此属性在启动时只检查一次。”

该属性在启动时设置,所以在运行应用程序时不会改变。

我希望这有帮助。

参考: https : //docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html

java.net.URL.openStream()java.net.URL.openConnection().getInputStream()的简写。

更新:您需要将系统属性java.net.useSystemProxies设置为true以使我的解决scheme能够正常工作。

如果使用java.net.URL.openStream()获取Web资源内容的InputStream ,则会自动获取与Internet Explorer将用于该URL的代理服务器相同的代理服务器。

无需转到Java控制面板或显示使用的代理。