使用Java检测Windows/IE代理设置

27

我需要自动检测用户是否需要代理才能访问互联网。Java应用程序是否有办法读取系统的代理设置?

谢谢, Jimmy

2个回答

36

Java SE 1.5 提供了 ProxySelector 类来检测代理设置。如果直接连接到互联网,则代理类型将为 DIRECT,否则它将返回主机和端口。

下面的示例说明了这个功能:

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.util.Iterator;
import java.util.List;

public class TestProxy {

    public static void main(String[] args) {
        try {
            System.setProperty("java.net.useSystemProxies","true");
            List<Proxy> l = ProxySelector.getDefault().select(
                        new URI("http://www.yahoo.com/"));

            for (Iterator<Proxy> iter = l.iterator(); iter.hasNext(); ) {

                Proxy proxy = iter.next();

                System.out.println("proxy hostname : " + proxy.type());

                InetSocketAddress addr = (InetSocketAddress)proxy.address();

                if(addr == null) {

                    System.out.println("No Proxy");

                } else {
                    System.out.println("proxy hostname : " + addr.getHostName());
                    System.out.println("proxy port : " + addr.getPort());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4
我正在获取的是:代理主机名:DIRECT,没有代理。这是否意味着我没有在代理服务器后面? - Koray Tugay
不要忘记为此代码导入java.util.*和java.net.*。 - Graham Mitchell
提醒一下 - 你需要导入以下内容:import java.net.InetSocketAddress; import java.net.Proxy; import java.net.ProxySelector; import java.net.URI; import java.util.Iterator; import java.util.List; - mycowan

29

这个other答案无疑是优秀和正确的,但是我想在这里补充一些内容...

如果您使用的是配置有“自动检测代理设置”的计算机,我相信它被称为PAC,那么使用Java gubbins来检测代理的代码将无法正常工作(它会认为这是一个“直接”连接)。

然而,有一个名为proxy vole(我认为是新的BSD许可证)的库,您可以使用它来替代。因此,这里是稍微修改了other答案代码来使用该库:

public class testProxy {    
    public static void main(String[] args) {
        try {    
            System.setProperty("java.net.useSystemProxies","true");

            // Use proxy vole to find the default proxy
            ProxySearch ps = ProxySearch.getDefaultProxySearch();
            ps.setPacCacheSettings(32, 1000*60*5);                             
            List l = ps.getProxySelector().select(
                    new URI("http://www.yahoo.com/"));

            //... Now just do what the original did ...
            for (Iterator iter = l.iterator(); iter.hasNext(); ) {
                Proxy proxy = (Proxy) iter.next();

                System.out.println("proxy hostname : " + proxy.type());
                InetSocketAddress addr = (InetSocketAddress)
                    proxy.address();

                if(addr == null) {    
                    System.out.println("No Proxy");    
                } else {
                    System.out.println("proxy hostname : " + 
                            addr.getHostName());

                    System.out.println("proxy port : " + 
                            addr.getPort());    
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }        
    }
}

它需要这些导入:
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URI;
import java.util.Iterator;
import java.util.List;

import com.btr.proxy.search.ProxySearch;

噢,还有关于代理自动配置工具Proxy Vole的使用示例在这里


非常好,這正是我尋找的東西,因為我們正在使用PAC腳本。由於使用您的代碼後必須以程序方式設置代理主機/端口,而不是在eclipse中傳遞VM引數的原因。 - yonikawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接