[英]Does Java's ProxySelector not work with automatic proxy configuration scripts?
我希望我的 Java 程序使用系統的代理配置。 因此,我使用在許多地方找到的代碼,例如這個 answer ,將java.net.useSystemProxies
設置為 true 並調用ProxySelector.getDefault().select(...)
來發現我想要的特定主機的代理抵達。 當我在 Internet 屬性中配置了單個顯式代理服務器時,這可以正常工作。 但是如果我設置了“使用自動配置腳本”,它總是返回直接的“代理”。
我知道該腳本有效,因為我的瀏覽器可以訪問它為其返回代理服務器的主機,而如果沒有腳本集,它就不能。 我什至嘗試將腳本簡化為最基本的要素:
function FindProxyForURL(url, host)
{
return "PROXY my.proxy.mydomain:3128";
}
它在我的瀏覽器中工作,但ProxySelector.getDefault().select(...)
仍然只返回 DIRECT。
我錯過了什么嗎? (這是在 Java 1.6 和 Windows 7 上,如果有關系的話。)
不,Java ProxySelector不讀取代理自動配置(PAC)文件。
但是, 正如Brian de Alwis對我的類似問題的回答所建議的那樣, Proxy Vole庫似乎提供了這種支持/功能。
要為Java應用程序提供開箱即用的網絡連接,您可以使用Proxy-Vole庫。 它提供了一些自動檢測當前代理設置的策略。 有許多可配置的策略可供選擇。 目前,Proxy-Vole支持以下代理檢測策略。
- 讀取平台設置(支持:Windows,KDE,Gnome,OSX)
- 讀取瀏覽器設置(支持:Firefox 3.x,Internet Explorer; Chrome和Webkit使用平台設置)
- 讀取環境變量(Linux / Unix服務器系統上經常使用的變量)
- 使用WPAD / PAC自動檢測腳本 (不支持所有變體)
正如Mads Hansen已經提出的那樣, Proxy-Vole可以解決問題!
您只需要將下載站點中的jar添加到類路徑(包括dll),這段代碼幫助我配置代理服務器:
ProxySearch proxySearch = new ProxySearch();
proxySearch.addStrategy(Strategy.OS_DEFAULT);
proxySearch.addStrategy(Strategy.JAVA);
proxySearch.addStrategy(Strategy.BROWSER);
ProxySelector proxySelector = proxySearch.getProxySelector();
ProxySelector.setDefault(proxySelector);
URI home = URI.create("http://www.google.com");
System.out.println("ProxySelector: " + proxySelector);
System.out.println("URI: " + home);
List<Proxy> proxyList = proxySelector.select(home);
if (proxyList != null && !proxyList.isEmpty()) {
for (Proxy proxy : proxyList) {
System.out.println(proxy);
SocketAddress address = proxy.address();
if (address instanceof InetSocketAddress) {
String host = ((InetSocketAddress) address).getHostName();
String port = Integer.toString(((InetSocketAddress) address).getPort());
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxyPort", port);
}
}
}
是的,從版本 9開始,將從操作系統讀取自動代理配置 (PAC/WPAD)。
我可以在Java上加載Proxy Auto-Config(PAC)文件。 請參閱以下代碼和包裝。 我希望這會是你想要的:
import com.sun.deploy.net.proxy.*;
.
.
BrowserProxyInfo b = new BrowserProxyInfo();
b.setType(ProxyType.AUTO);
b.setAutoConfigURL("http://yourhost/proxy.file.pac");
DummyAutoProxyHandler handler = new DummyAutoProxyHandler();
handler.init(b);
URL url = new URL("http://host_to_query");
ProxyInfo[] ps = handler.getProxyInfo(url);
for(ProxyInfo p : ps){
System.out.println(p.toString());
}
您的計算機上已經有[com.sun.deploy.net.proxy]包了! 找到[deploy.jar]; D.
您可以使用Proxy Vole來解決此問題:
如果您確切知道要使用哪個PAC文件,則可以執行以下操作:
UrlPacScriptSource source = new UrlPacScriptSource("http://www.example.org/proxy.pac");
PacProxySelector selector = new PacProxySelector(source);
ProxySelector.setDefault(selector);
這樣做的好處是它與用戶無關。 例如,如果將其作為Windows服務運行,則可能最終在SYSTEM用戶上運行它,該用戶可能沒有與管理員用戶相同的OS_DEFAULT
代理設置(如果有)。
使用系統/軟件值的方法是:
ProxySearch proxySearch = new ProxySearch();
proxySearch.addStrategy(Strategy.OS_DEFAULT);
proxySearch.addStrategy(Strategy.BROWSER);
proxySearch.addStrategy(Strategy.JAVA);
ProxySelector proxySelector = proxySearch.getProxySelector();
ProxySelector.setDefault(proxySelector);
這從OS_DEFAULT
開始,然后是JAVA
,最后是BROWSER
作為代理選擇器的策略。
此代碼基於GitHub代碼,發行版本1.0.3。
通過 web 搜索,回答一個 10 年前的問題,以幫助任何偶然發現此線程的人。
最簡單的解決方案是在操作系統上配置代理,讓 JVM 通過標准 JVM 系統屬性java.net.useSystemProxies
在程序啟動時自動獲取系統值。
您可以通過命令行參數將其從外部提供給程序-Djava.net.useSystemProxies=true
或通過System.setProperty("java.net.useSystemProxies", "true")
在程序入口點硬編碼此要求
這可確保您的代碼易於移植並通過操作在外部進行配置,因為它不涉及任何代碼位來猜測代理設置。
請參閱此處的代理文檔: https://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.