25

Javaプログラムでシステムのプロキシ構成を使用したい。したがって、この回答java.net.useSystemProxiesなど、多くの場所で見つかったコードを使用してtrueに設定し、呼び出しProxySelector.getDefault().select(...)て、到達したい特定のホストのプロキシを検出しました。これは、インターネットのプロパティで単一の明示的なプロキシサーバーを構成した場合に正常に機能します。ただし、「自動構成スクリプトを使用する」を設定した場合は、常にDIRECTの「プロキシ」が返されます。

私のブラウザはプロキシサーバーを返すホストにアクセスできますが、スクリプトが設定されていないとアクセスできないため、スクリプトが機能することはわかっています。スクリプトを最も重要な要素に単純化してみました。

function FindProxyForURL(url, host)
{
    return "PROXY my.proxy.mydomain:3128";
}

そしてそれは私のブラウザで動作しますが、ProxySelector.getDefault().select(...)それでもDIRECTのみを返します。

私は何かが足りないのですか?(これは、Java1.6およびWindows7にあります。)

4

5 に答える 5

32

いいえ、JavaProxySelectorはProxyAuto -Config(PAC)ファイルを読み取りません。

ただし、私の同様の質問に対する回答としてBrian de Alwisが提案したように、 ProxyVoleライブラリはそのサポート/機能を提供しているようです。

Javaアプリケーションにすぐに使用できるネットワーク接続を提供するには、Proxy-Voleライブラリを使用できます。現在のプロキシ設定を自動検出するためのいくつかの戦略を提供します。選択できる構成可能な戦略はたくさんあります。現在、Proxy-Voleは次のプロキシ検出戦略をサポートしています。

  • プラットフォーム設定の読み取り(サポート:Windows、KDE、Gnome、OSX)
  • ブラウザ設定の読み取り(サポート:Firefox 3.x、Internet Explorer、ChromeおよびWebkitはプラットフォーム設定を使用します)
  • 環境変数の読み取り(Linux / Unixサーバーシステムでよく使用される変数)
  • WPAD / PACを使用した自動検出スクリプト(すべてのバリエーションがサポートされているわけではありません)
于 2012-04-26T01:03:32.883 に答える
15

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); 
   } 
 } 
}
于 2012-09-26T15:01:46.750 に答える
5

Proxy Voleを使用して、この問題を解決できます。

使用するPACファイルが正確にわかっている場合は、次の操作を実行できます。

UrlPacScriptSource source = new UrlPacScriptSource("http://www.example.org/proxy.pac");
PacProxySelector selector = new PacProxySelector(source);

ProxySelector.setDefault(selector);

これの利点は、ユーザーに関係がないことです。たとえば、これをWindowsサービスとして実行する場合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_DEFAULTJAVA最後BROWSERにプロキシセレクターの戦略として使用されます。

このコードは、GitHubコードのリリースバージョン1.0.3に基づいています。

于 2017-12-11T13:14:35.750 に答える
4

JavaにProxyAuto-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を検索します

于 2012-06-08T15:22:31.553 に答える
4

はい、バージョン9から、自動プロキシ構成(PAC / WPAD)がオペレーティングシステムから読み取られます。

于 2019-09-11T14:53:27.513 に答える