簡體   English   中英

Java 的 ProxySelector 不能與自動代理配置腳本一起使用嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM