HttpURLConnectionでプロキシを使用するにはどうすればよいですか?


136

これをしたら...

conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());

印刷する

Proxy? false

問題は、プロキシの背後にいることです。JVMはWindowsでプロキシ情報をどこから取得しますか?どうすれば設定できますか?私の他のすべてのアプリは私のプロキシに完全に満足しているようです。

回答:


336

java 1.5以降では、java.net.ProxyインスタンスをopenConnection(proxy)メソッドに渡すこともできます。

//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);

プロキシで認証が​​必要な場合は、407の応答が返されます。

この場合、次のコードが必要です。

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);

7
プロキシユーザー名とプロキシパスワードを提供できますか。
Xolve

15
プロキシごとに異なるユーザー名/パスワードのペアがある場合はどうなりますか?オーセンティケータが理想的ではないデフォルトを設定するには、静的メソッドを呼び出すと、これははるかに良いのsysのプロパティの設定方法を以下ではありません...
javaPhobic

2
Authenticator.defaultは静的(つまり、グローバル)変数なので、1回だけです。ただし、上記のオーセンティケーターは最小限の例にすぎないことに注意してください。一度に1つのパスワードしか処理できません。異なるパスワードを持つ複数のホストを処理できる例については、Google。
Stroboskop 2016年

3
8u11はデフォルトでは基本認証では機能しないため、oracle.com / technetwork / java / javase / 8u111
white

3
ドメインを持っている場合。次のように行います:new PasswordAuthentication("domainName\\user", "password".toCharArray());
開発者マリウスŽilėnas

34

これはインターネットから回答するのはかなり簡単です。システムプロパティhttp.proxyHostとを設定しますhttp.proxyPort。これを行うにはSystem.setProperty()、またはコマンドラインから-D構文を使用します。


19

プロキシは、http.proxyHostとhttp.proxyPortの2つのシステムプロパティを通じてサポートされます。これらは、それぞれプロキシサーバーとポートに設定する必要があります。次の基本的な例は、それを示しています。

String url = "http://www.google.com/",
       proxy = "proxy.mydomain.com",
       port = "8080";
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
readResponse(in);

@Pascal Apacheと比較して最新のJavaアプローチを使用することの主な違いは何commons-httpclientですか。Javaはプロキシと認証をサポートしているため(ここでは、stackoverflow.com / questions / 1626549 / … )、単純なケース(パブリックHTTPサーバーから1つのファイルを取得するなど)の場合、Apacheライブラリを使用する理由はありません。あなたのおすすめは何ですか?
dma_k

@dma_k私はあなたに同意します。あなたが説明したような単純なユースケースでは、サードパーティのライブラリは使用しません。
Pascal Thivent

nonProxyHostsをサポートする方法を知っていますか?私のデバイスはそれをサポートしているようですが、アプリでそれを処理する方法を知りません。
RiRomain

ただし、変数systemPropertiesconnection!では使用されません。
パーサー

12

設定することもできます

-Djava.net.useSystemProxies=true

WindowsおよびLinuxでは、これはシステム設定を使用するため、自分で繰り返す必要はありません(DRY)

http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies


6
これは、手動のプロキシサーバー構成でのみ機能します。自動プロキシ構成とスクリプトを介して構成されたプロキシは(まだ) "useSystemProxies"に伝達されません。
2014年

1
これは、proxyHostとproxyPortの設定がうまくいかなかったときに私にとってはうまくいきました。ありがとう!
nrobey 2015

呼び出し時に同様に、これは私の会社のプロキシの背後から働いたSystem.setPropertyためhttps.proxyHosthttps.proxyPort、いくつかの理由のためには、マスタードをカットされませんでした。
Pavel Komarov、

10

openConnectionの前に以下を設定します。

System.setProperty("http.proxyHost", "host");
System.setProperty("http.proxyPort", "port_number");

プロキシが認証を必要とする場合、

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");

7
「http.proxyUser」と「http.proxyPassword」はもうサポートされていないと思います。詳細については、stackoverflow.com / questions / 120797 /…をご覧ください。
p3t0r 2009年


2

承認された回答は機能します...プロキシホストとポートがわかっている場合=)。ただし、プロキシホストとポートを探している場合は、以下の手順が役立つはずです。

自動構成されたプロキシが指定されている場合:

1> IE(または任意のブラウザー)を開く

2> IE-> Tools-> internet option-> connections-> LAN Settings-> get addressを使用してブラウザからURLアドレスを取得し、URLを指定します。例:http ://autocache.abc.com/として 入力し、aファイルは.pac形式でダウンロードされ、デスクトップに保存されます

3>テキストパッドで.pacファイルを開き、プロキシを識別します。

エディターでは、次のようになります。

"PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";を返します。

5分でmavenからbekurする功績が機能しません

ホストとポートを取得したら、これにポップインして、準備完了です

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.