用Java读取系统代理

问题描述 投票:0回答:3

令人惊讶的是,我找不到这样一个微不足道的问题的有效解决方案。

在 Java servlet 中,我需要连接到外部网站,在 doGet 方法中我正在使用

URL website = new URL(websiteUrl);

为此。

此代码可以在我的 PC 上运行,但在生产 Linux 应用程序服务器上运行时无法连接。

我检查了服务器上的 Firefox 网络设置,它被设置为使用系统代理。 在 Linux 终端中使用

echo $http_proxy
命令读取代理设置并将代码更改为:

URL website = new URL("http", proxy, Integer.parseInt(proxyPort), websiteUrl);

设置代理设置硬编码。

现在它可以工作了,但显然我不想对代理设置进行硬编码,而是动态读取它。

这就是我绊倒的地方,因为我在互联网上找到的方法都不适合我。

System.getProperty("http.proxyHost")
System.getProperty("http_proxy")

ProxySelector 方法 或添加

System.setProperty("java.net.useSystemProxies", "true");

没有带来任何结果。

有可行的解决方案吗? 知道为什么这些常见的解决方案对我的情况不起作用吗?

我在 RHEL 6 上运行 WebLogic 10.3.5/JRockit。 谢谢。

java proxy
3个回答
0
投票
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 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.setProperty("http.proxyHost", addr.getHostName());
            System.out.println("proxy port : " + addr.getPort());
            System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));
        }
    }
}

0
投票

我认为晚了十年。但我写这个也许有人需要那个

您可以使用proxy-vole

这是一个示例用法(我从IntelliJ源代码中获取了代码)

private static @NotNull ProxySearch getDefaultProxySearchStrategy() {
    ProxySearch proxySearch = new ProxySearch();
    proxySearch.addStrategy(ProxySearch.Strategy.JAVA);////////
    proxySearch.addStrategy(ProxySearch.Strategy.OS_DEFAULT);
    if (SystemInfo.isWindows) { // for some (likely legacy) reasons, system proxy settings can only be detected using the search for IE
      proxySearch.addStrategy(ProxySearch.Strategy.IE);
    }
    proxySearch.addStrategy(ProxySearch.Strategy.ENV_VAR);
    // cache 32 urls for up to 10 min
    proxySearch.setPacCacheSettings(32, 10 * 60 * 1000, BufferedProxySelector.CacheScope.CACHE_SCOPE_HOST);
    return proxySearch;
}

-1
投票

您可能没有系统范围的防御代理,但 Firefox 在其设置中配置了一个。因此,代理检测代码正确地指出:没有代理。

© www.soinside.com 2019 - 2024. All rights reserved.