コアJavaでプロキシサーバーを介して接続する

コアJavaのプロキシサーバーを介した接続

1. 前書き

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

このチュートリアルでは、how to connect through proxy servers in Javaを見ていきます。

最初に、JVM全体で、システムプロパティを使用して構成された、より古い、よりグローバルなアプローチについて説明します。 その後、Proxyクラスを紹介します。これにより、接続ごとに構成できるようになり、より詳細に制御できるようになります。

2. セットアップ

この記事のサンプルを実行するには、プロキシサーバーにアクセスする必要があります。 Squidは、ほとんどのオペレーティングシステムで使用できる一般的な実装です。 Squidのデフォルト構成は、ほとんどの例で十分です。

3. グローバル設定の使用

Javaは、JVM全体の動作を構成するために使用できるシステムプロパティのセットを公開します。 この「1つのサイズですべてのアプローチに対応」は、ユースケースに適している場合、実装が最も簡単なことがよくあります。

set the required properties from the command line when invoking the JVMできます。 別の方法として、set them by calling System.setProperty() at runtimeを使用することもできます。

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

Javaは、HTTP、HTTPS、FTP、およびSOCKSプロトコルのプロキシハンドラを提供します。 ホスト名とポート番号として、ハンドラーごとにプロキシを定義できます。

  • http.proxyHost –HTTPプロキシサーバーのホスト名

  • http.proxyPort – HTTPプロキシサーバーのポート番号–プロパティはオプションであり、指定されていない場合はデフォルトで80になります。

  • http.nonProxyHosts –プロキシをバイパスする必要があるホストパターンのパイプ区切り( "|")リスト–設定されている場合、HTTPハンドラーとHTTPSハンドラーの両方に適用されます

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

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

nonProxyHostsを指定する場合、ホストパターンはワイルドカード文字(「*」)で開始または終了する場合があります。 Windowsプラットフォームでは、「||」区切り文字をエスケープする必要がある場合があります。 利用可能なすべてのプロキシ関連のシステムプロパティの完全なリストは、Oracle’s official Java documentation on networking propertiesにあります。

3.2. コマンドライン引数を介して設定

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

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

この方法でプロセスを開始すると、追加の作業を行うことなく、URLopenConnection()を簡単に使用できます。

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. グローバル構成の制限

システムプロパティでグローバル構成を使用することは簡単に実装できますが、このアプローチはlimits what we can do because the settings apply across the entire JVMです。 このため、特定のプロトコルに対して定義された設定は、JVMの存続期間中、または設定が解除されるまでアクティブです。

この制限を回避するために、必要に応じて設定のオンとオフを切り替えたいと思うかもしれません。 マルチスレッドプログラムでこれを安全に行うには、同時実行の問題から保護するための手段を導入する必要があります。

別の方法として、the Proxy API provides more granular control over proxy configuration.

4. ProxyAPIの使用

Proxyクラスは、接続ごとにプロキシを構成するための柔軟な方法を提供します。 既存のJVM全体のプロキシ設定がある場合、Proxyクラスを使用した接続ベースのプロキシ設定がそれらをオーバーライドします。

Proxy.Typeで定義できるプロキシには次の3つのタイプがあります。

  • HTTP –HTTPプロトコルを使用するプロキシ

  • SOCKS –SOCKSプロトコルを使用するプロキシ

  • DIRECT –プロキシなしで明示的に構成された直接接続

4.1. HTTPプロキシの使用

HTTPプロキシを使用するには、最初にwrap a SocketAddress instance with a Proxy and type of 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. ダイレクトプロキシの使用

ホストに直接接続する必要がある場合があります。 この場合、インスタンスを明示的にbypass a proxy that may be configured globally by using the static Proxy.NO_PROXYできます。 裏で、APIはProxy.Type.DIRECTをタイプ:として使用して、Proxyの新しいインスタンスを構築します

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

基本的に、グローバルに構成されたプロキシがない場合、これは引数なしでopenConnection() を呼び出すことと同じです。

4.3. SOCKSプロキシの使用

SOCKSプロキシの使用は、URLConnection.を使用する場合のHTTPバリアントに似ています。まず、wrapping a SocketAddress instance with a Proxy using a type of 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);

use a SOCKS proxy when connecting to a TCP socketにすることも可能です。 まず、Proxyインスタンスを使用してSocketを作成します。 その後、pass the destination SocketAddress instance to Socket.connect()

Socket proxySocket = new Socket(socksProxy);
InetSocketAddress socketHost
  = new InetSocketAddress(SOCKET_SERVER_HOST, SOCKET_SERVER_PORT);
proxySocket.connect(socketHost);

5. 結論

この記事では、コアJavaでプロキシサーバーを使用する方法について説明しました。

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

いつものように、この記事で使用されているすべてのソースコードはon GitHubにあります。