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

2022-09-01 05:03:13

我确实看到了有关为JVM设置代理的问题,但我想问的是如何利用已经配置的代理(在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);
    }
}

小程序显示“无”,而不考虑您在 Java 控制面板中放置的设置。如果Windows代理设置(通常在Internet Explorer中设置)是我可以确定的,那么最好的方法是,但是在Java控制面板中执行额外的配置步骤仍然是一个可以接受的解决方案。

谢谢!


答案 1

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

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

答案 2

这可能有点晚了,但我遇到了同样的问题。我修复它的方式是通过添加以下系统属性:

-Djava.net.useSystemProxies=true

现在,请注意,此属性仅在启动时设置一次,因此在运行应用程序时无法更改。从 https://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies

java.net.useSystemProxies (default: false) ...请注意,此属性仅在启动时检查一次。


推荐