【问题标题】:Detecting Windows/IE proxy setting using Java使用 Java 检测 Windows/IE 代理设置
【发布时间】:2011-06-23 10:49:21
【问题描述】:

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

谢谢, 吉米

【问题讨论】:

    标签: java proxy


    【解决方案1】:

    Java SE 1.5 提供了 ProxySelector 类来检测代理设置。如果直接连接到 Internet,则代理类型将为 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();
            }
        }
    }
    

    【讨论】:

    • 我得到:代理主机名:DIRECT 没有代理这是否意味着我不在代理服务器后面?
    • 不要忘记为此代码导入 java.util.* 和 java.net.*。
    • 提醒 - 您需要导入这些 import java.net.InetSocketAddress;导入 java.net.Proxy;导入 java.net.ProxySelector;导入 java.net.URI;导入 java.util.Iterator;导入 java.util.List;
    【解决方案2】:

    other,接受,答案无疑是极好的和正确的,但我想我会在这里添加一些东西......

    如果您在配置了“自动检测代理设置”的机器上,我相信它被称为PAC,那么使用 Java gubbins 在答案中检测代理的代码将不起作用(它会认为它是“直接”连接)。

    有一个名为 proxy vole 的库(我认为是新的 BSD license),但是,您可以使用它,所以这里是 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;
    

    哦,还有代理田鼠 here 的用法示例。

    【讨论】:

    • 完美,这是我一直在寻找的,因为我们使用的是 PAC 脚本。出于某种原因,我必须在使用您的代码后以编程方式设置代理主机/端口,而不是在 eclipse 中作为 VM 参数传入。
    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多