1前書き

プロキシサーバーは、クライアントアプリケーションと他のサーバーとの間の仲介者として機能します。企業環境では、通常、ネットワーク境界を越えてユーザーが消費するコンテンツを制御するためにこれらを使用します。

このチュートリアルでは、Javaでプロキシサーバーを介して接続する方法を見ていきます。

まず、JVM全体でシステムプロパティを使用して構成された、より古くよりグローバルなアプローチを探ります。その後、

Proxy

クラスを紹介します。これは、接続ごとに設定を許可することで、より細かく制御できるようにします。


2セットアップ

この記事のサンプルを実行するには、プロキシサーバーにアクセスする必要があります。


Squid

は、ほとんどのオペレーティングシステムで利用可能な一般的な実装です。 Squidのデフォルト設定は私達の例の大部分にとっては十分でしょう。


3グローバル設定を使用する

Javaは、JVM全体の動作を設定するために使用できる一連のシステムプロパティを公開します。この「ワンサイズがすべてのアプローチに適合する」は、ユースケースに適していれば、実装するのが最も簡単です。

JVMを起動するときに、コマンドラインから必要なプロパティを設定できます。代わりに、実行時に__System.setProperty()を呼び出して** 設定することもできます。


3.1. 利用可能なシステムプロパティ

Javaは、HTTP、HTTPS、FTP、およびSOCKSプロトコル用のプロキシハンドラを提供します。

プロキシは、ハンドラごとにホスト名とポート番号として定義できます。



  • http.proxyHost


    – HTTPプロキシサーバーのホスト名



  • http.proxyPort


    – HTTPプロキシサーバーのポート番号 –

propertyはオプションであり、指定されていない場合はデフォルトの80になります。


http.nonProxyHosts ** – ホストパターンのパイプ区切り(「|」)リスト

プロキシをバイパスする必要がある場合 – HTTPとHTTPの両方に適用されます。
HTTPSハンドラが設定されている場合



socksProxyHost

** – SOCKSプロキシサーバーのホスト名



  • socksProxyPort


    – SOCKSプロキシサーバーのポート番号


nonProxyHosts

を指定した場合、ホストパターンはワイルドカード文字(「** 」)で開始または終了します。 Windowsプラットフォームでは、「|」区切り文字をエスケープする必要があるかもしれません。利用可能なすべてのプロキシ関連システムプロパティの完全なリストはhttps://docs.oracle.com/javase/8/docs/api/java/net/doc-files/net-properties.html[Oracleの公式Java]にあります。ネットワーク特性に関する文書]。


3.2. コマンドライン引数で設定

システムプロパティとして設定を渡すことで、コマンドラインでプロキシを定義できます。

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 com.baeldung.networking.proxies.CommandLineProxyDemo

このようにしてプロセスを開始するとき、追加の作業なしで

URL



openConnection()

を使用することができます。

URL url = new URL(RESOURCE__URL);
URLConnection con = url.openConnection();


3.3.

System.setPropertyを使用して設定(String、String)


コマンドラインでプロキシプロパティを設定できない場合は、プログラム内で

System.setProperty()

を呼び出して設定できます。

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "3128");

URL url = new URL(RESOURCE__URL);
URLConnection con = url.openConnection();//...

後で関連するシステムプロパティを手動で設定解除すると、プロキシは使用されなくなります。

System.setProperty("http.proxyHost", null);


3.4. グローバル設定の制限事項

システムプロパティでグローバル設定を使用するのは簡単に実装できますが、設定はJVM全体に適用されるため、この方法ではできることが制限されます。このため、特定のプロトコルに対して定義された設定は、JVMの有効期間中、または設定解除されるまで有効です。

この制限を回避するには、必要に応じて設定のオンとオフを切り替えることが魅力的です。マルチスレッドプログラムでこれを安全に実行するには、並行性の問題から保護するための対策を導入する必要があります。

別の方法として、Proxy APIはプロキシ設定をより細かく制御することができます。


4

Proxy

APIを使用する


Proxy

クラスを使用すると、接続ごとにプロキシを柔軟に設定できます。既存のJVM全体のプロキシ設定がある場合は、

Proxy

クラスを使用した接続ベースのプロキシ設定がそれらをオーバーライドします。


Proxy.Type

で定義できるプロキシは3種類あります。


  • HTTP

    – HTTPプロトコルを使ったプロキシ


  • SOCKS

    – SOCKSプロトコルを使ったプロキシ


  • DIRECT

    – プロキシなしで明示的に設定された直接接続


4.1. HTTPプロキシを使用する

HTTPプロキシを使用するには、最初に

SocketAddress

インスタンスを

Proxy

とタイプ

Proxy.Type.HTTP

** でラップします。次に、

Proxy

インスタンスを__URLConnection.openConnection()に渡します。

URL weburl = new URL(URL__STRING);
Proxy webProxy
  = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128));
HttpURLConnection webProxyConnection
  = (HttpURLConnection) weburl.openConnection(webProxy);

簡単に言うと、これは

URL

STRING

に接続しますが、その接続は

127.0.0.1:3128__にホストされているプロキシサーバーを介してルーティングするということです。


4.2. DIRECTプロキシを使用する

ホストに直接接続する必要があるかもしれません。この場合、静的な

Proxy.NO

PROXY

** インスタンスを使用して、グローバルに設定される可能性のあるプロキシを明示的に回避することができます。カバーの下で、APIは

Proxy.Type.DIRECT

を型


として使用して、

Proxy__の新しいインスタンスを作成します。

HttpURLConnection directConnection
  = (HttpURLConnection) weburl.openConnection(Proxy.NO__PROXY);

基本的に、グローバルに設定されたプロキシがなければ、これは引数なしで____openConnection()を呼び出すのと同じです。


4.3. SOCKSプロキシを使用する


URLConnectionを使用する場合、SOCKSプロキシを使用することはHTTPバリアントに似ています。

SocketAddress

インスタンスを

Proxy.でラップすることから始めます。タイプは

Proxy.Type.SOCKS

** です。その後、

Proxy

インスタンスを

URLConnection.openConnection

に渡します。

Proxy socksProxy
  = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1080));
HttpURLConnection socksConnection
  = (HttpURLConnection) weburl.openConnection(socksProxy);

TCPソケットへの接続時にSOCKSプロキシを使用することも可能です。まず、

Proxy

インスタンスを使用して

Socket

を構築します。

その後、宛先の

SocketAddress

インスタンスを

Socket.connect()

** に渡します。

Socket proxySocket = new Socket(socksProxy);
InetSocketAddress socketHost
  = new InetSocketAddress(SOCKET__SERVER__HOST, SOCKET__SERVER__PORT);
proxySocket.connect(socketHost);


5結論

この記事では、コアJavaでプロキシサーバーを操作する方法を調べました。

最初に、システムプロパティを使用してプロキシサーバーを介して接続する、より古くよりグローバルなスタイルを調べました。次に、プロキシサーバーを介して接続するときにきめ細かい制御を提供する

Proxy

クラスの使用方法を見ました。

いつものように、この記事で使われているすべてのソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-networking[on GitHub]にあります。