10 Javaネットワーク

JavaネットワークAPIでは、ネットワーク機能のためのクラスを提供します。たとえば、アドレス指定、URLやURIを使用するためのクラス、サーバーに接続するためのソケット・クラス、ネットワーク・セキュリティ機能などがあります。これは、次のパッケージおよびモジュールで構成されています:

  • java.net: ネットワーク・アプリケーションを実装するためのクラス。
  • java.net.http: HTTPクライアントのAPIを含みます。これは、HTTP (バージョン1.1および2)への高レベルのクライアント・インタフェースおよびWebSocketインスタンスへの低レベルのクライアント・インタフェースを提供します。ビデオおよびサンプル・コードを含むこのAPIの詳細は、Java HTTPクライアントに関する項を参照してください。

    ノート:

    クライアント・アプリケーションのテストおよびデバッグには、jwebserverツールを使用できます。
  • javax.net: ソケット作成用のクラス。
  • javax.net.ssl: セキュア・ソケット・クラス。
  • jdk.httpserver: 教育やテストを目的としたHTTPサーバーを構築するためのプラットフォーム固有のAPIと、最小限のHTTPサーバーを実行するためのjwebserverツール。
  • jdk.net: java.netおよびjava.nio.channelsソケット・クラスのプラットフォーム固有のソケット・オプション。

ネットワーク・システム・プロパティ

次の3つの方法のいずれかで、次のネットワーク・システム・プロパティを設定できます:

  • javaコマンドの-Dオプションの使用
  • System.setProperty(String, String)メソッドの使用
  • $JAVA_HOME/conf/net.propertiesファイルでの指定。このファイルで指定できるのは、プロキシ関連のプロパティのみです。

特に指定がないかぎり、プロパティ値は使用されるたびにチェックされます。

詳細は、Java SE API仕様の「ネットワークのプロパティ」および「java.net.http」モジュールを参照してください。

HTTPクライアント・プロパティ

次のプロパティの一部は、ユーザー指定の値をオーバーライドする事前定義された最小値と最大値の対象となります。プロパティが存在しても、値がない場合、ブール値のデフォルト値はtrueです。

表10-1 HTTPクライアント・プロパティ

プロパティ デフォルト値 説明
jdk.httpclient.allowRestrictedHeaders デフォルト値なし

ユーザーがHTTPリクエストまたはHttpRequestインスタンスのユーザー・コードで設定できる、通常制限されたHTTPヘッダー名のカンマ区切りリストです。

デフォルトでは、ユーザー・コードで、connectioncontent-lengthexpecthostおよびupgradeリクエスト・ヘッダーを設定できません。この動作は、このプロパティを使用してオーバーライドできます。

このプロパティに指定されるヘッダー名では、大文字と小文字が区別されず、空白は無視されます。このプロパティはテスト用であり、実際のデプロイメント用ではないことに注意してください。このプロパティを使用すると、プロトコル・エラーやその他の未定義の動作が発生する可能性があります。

コンテキストによっては、他のヘッダーの設定が制限される場合があります。関連するHttpClientにオーセンティケータ・セットがある場合、これにAuthorizationヘッダーが含まれます。これらの制限は、このプロパティではオーバーライドできません。

jdk.httpclient.auth.retrylimit 3 Basic認証フィルタが、失敗した認証の再試行を行う試行回数。
jdk.httpclient.bufsize

16384 (16KB)

内部割当てバッファに使用するサイズ(バイト単位)。
jdk.httpclient.connectionPoolSize 0 HTTP/1.1キープ・アライブ・キャッシュ内に保持する最大接続数。0を指定すると、キャッシュの制限がなくなります。
jdk.httpclient.connectionWindowSize 2^26

HTTP/2クライアント接続ウィンドウのサイズ(バイト単位)。

最大サイズは2^31-1です。この値をストリーム・ウィンドウ・サイズより小さくすることはできません。

jdk.httpclient.disableRetryConnect false 接続失敗の自動再試行が無効かどうか。falseの場合、再試行が試みられます(再試行制限に従います)。
jdk.httpclient.enableAllMethodRetry false 冪等でないHTTPリクエストを自動的に再試行できるかどうか。
jdk.httpclient.enablepush 1 HTTP/2プッシュ・プロミスが有効かどうか。値1を指定するとプッシュ・プロミスが有効になります。値0を指定すると無効になります。
jdk.httpclient.hpack.maxheadertablesize

16384 (16KB)

HTTP/2クライアントのHPACKヘッダー表の最大サイズ(バイト単位)。
jdk.httpclient.HttpClient.log デフォルト値なし

JavaロギングAPI (パッケージjava.util.loggingに含まれる)を介して、様々なイベントの高レベルのロギングを有効にします。

値には、次のいずれかの項目のカンマ区切りリストが含まれます:

  • errors
  • requests
  • headers
  • content
  • frames
  • ssl
  • trace
  • channel

frames項目は、次のいずれかの項目のコロン区切りリストを使用して追加できます:

  • control
  • data
  • window
  • all

項目を指定すると、HTTPクライアントのログに追加されます。たとえば、次の値を指定すると、JavaロギングAPIによって、使用可能なすべてのHTTPクライアント・イベントが記録されます:

errors,requests,headers,frames:control:data:window,ssl,trace,channel

control:data:windowallに置き換えることができます。

ロガーの名前はjdk.httpclient.HttpClientで、すべてのロギングはレベルINFOです。

jdk.httpclient.keepalive.timeout 30 アイドル状態のHTTP/1.1接続をキープ・アライブ・キャッシュでアライブに維持する秒数。
jdk.httpclient.keepalive.timeout.h2 説明を参照 アイドル状態のHTTP/2接続をアライブに維持する秒数。設定されない場合、jdk.httpclient.keepalive.timeout 設定が使用されます。
jdk.httpclient.maxframesize

16384 (16KB)

HTTP/2クライアントの最大フレーム・サイズ(バイト単位)。サーバーはこれより大きいフレームを送信できません。
jdk.httpclient.maxstreams 100 接続当たりの最大同時HTTP/2ストリーム数。
jdk.httpclient.receiveBufferSize オペレーティング・システムのデフォルト値 HTTPクライアント・ソケット受信バッファ・サイズ(バイト単位)。「StandardSocketOptions.SO_RCVBUF」を参照してください。
jdk.httpclient.redirects.retrylimit 5 リダイレクト時またはなんらかの理由で障害が発生した場合にHTTPリクエストを送信しようとする最大試行回数。
jdk.httpclient.sendBufferSize オペレーティング・システムのデフォルト HTTPクライアント・ソケットの送信バッファ・サイズ。「StandardSocketOptions.SO_SNDBUF」を参照してください。ゼロ以下の値は無視されます。
jdk.httpclient.websocket.writeBufferSize 16384 (16KB) ソケット書込みのためにWebソケット実装によって使用されるバッファ・サイズ。
jdk.httpclient.windowsize

16777216 (16MB)

HTTP/2クライアント・ストリーム・ウィンドウのサイズ(バイト単位)。
jdk.internal.httpclient.disableHostnameVerification false trueの場合(または空文字列に設定されている場合)、SSL証明書のホスト名検証は無効になります。これはシステム・プロパティ専用で、conf/net.propertiesでは使用できません。これはテスト目的でのみ提供されています。

ノート:

プロパティjdk.http.auth.proxying.disabledSchemesおよびjdk.http.auth.tunneling.disabledSchemes(「その他のプロキシ関連プロパティ」を参照)もHttpClientによって考慮されます。

IPv4およびIPv6プロトコル

これらの2つのプロパティは、起動時に1回のみチェックされます。

表10-2 IPv4およびIPv6プロトコルのプロパティ

プロパティ デフォルト値 説明
java.net.preferIPv4Stack false

IPv6を利用可能なオペレーティング・システムでは、ベースとなるネイティブ・ソケットは、デフォルトではIPv6ソケットです。これによりアプリケーションは、IPv4ホストとIPv6ホストの両方に接続したり、その両方のホストからの接続を受け入れたりできます。

アプリケーションでIPv4専用ソケットを使用する場合は、このプロパティをtrueに設定します。これは、アプリケーションがIPv6専用ホストと通信できないことを意味します。

java.net.preferIPv6Addresses false

IPv4アドレスとIPv6アドレスの両方を持つホストを扱う場合、IPv6を利用可能なオペレーティング・システムでは、IPv6アドレスよりもIPv4アドレスの使用を優先するのがデフォルトの動作です。これは、たとえば、IPv4アドレスの表現(192.168.1.1など)に依存するアプリケーションの下位互換性を確保するためです。

このプロパティをtrueに設定すると、このプリファレンスが変更され、可能な場合はIPv4アドレスよりIPv6アドレスが使用されます。

オペレーティング・システムによって返されるアドレスの順序を保持するには、このプロパティをsystemに設定します。

HTTPプロキシ・プロパティ

次のプロキシ設定がHTTPプロトコル・ハンドラおよびデフォルトのプロキシ・セレクタによって使用されます。

表10-3 HTTPプロキシ・プロパティ

プロパティ デフォルト値 説明
http.proxyHost デフォルト値なし HTTPプロトコル・ハンドラが使用するプロキシ・サーバーです。
http.proxyPort 80 HTTPプロトコル・ハンドラが使用するポートです。
http.nonProxyHosts localhost|127.*|[::1]

プロキシを介さずにアクセスするホストを示します。通常これは内部ホストを定義します。このプロパティの値は、|文字で区切られたホストのリストです。また、パターン一致にはアスタリスク(*)を使用できます。たとえば、次のように指定すると、プロキシ・サーバーが指定されている場合でも、exmaple.comドメインおよびlocalhost内のすべてのホストに直接アクセスする必要があります:

-Dhttp.nonProxyHosts="*.example.com|localhost"

デフォルト値には、ループバック・アドレスのあらゆる一般的なバリエーションが含まれません。

HTTPSプロキシ・プロパティ

HTTPS (HTTP over SSL)は、主に機密性が必要な場合に使用されるHTTPのセキュアなバージョンです(支払い用のWebサイトなど)。次のプロキシ設定がHTTPSプロトコル・ハンドラおよびデフォルトのプロキシ・セレクタによって使用されます。

ノート:

HTTPSプロトコル・ハンドラは、HTTPプロトコルと同じhttp.nonProxyHostsプロパティを使用します。

表10-4 HTTPSプロキシ・プロパティ

プロパティ デフォルト値 説明
https.proxyHost デフォルト値なし HTTPSプロトコル・ハンドラが使用するプロキシ・サーバーです。
https.proxyPort 443 HTTPSプロトコル・ハンドラが使用するポートです。

FTPプロキシ・プロパティ

次のプロキシ設定がFTPプロトコル・ハンドラによって使用されます。

表10-5 FTPプロキシ・プロパティ

システム・プロパティ デフォルト値 説明
ftp.proxyHost デフォルト値なし FTPプロトコル・ハンドラが使用するプロキシ・サーバーです。
ftp.proxyPort 80 FTPプロトコル・ハンドラが使用するポートです。
ftp.nonProxyHosts localhost|127.*|[::1]

http.nonProxyHostsと同様に、このプロパティは、プロキシを介さずにアクセスするホストを示します。通常これは内部ホストを定義します。このプロパティの値は、|文字で区切られたホストのリストです。また、パターン一致にはアスタリスク(*)を使用できます。たとえば、次のように指定すると、プロキシ・サーバーが指定されている場合でも、exmaple.comドメインおよびlocalhost内のすべてのホストに直接アクセスする必要があります:

-Dftp.nonProxyHosts="*.example.com|localhost"

デフォルト値には、ループバック・アドレスのあらゆる一般的なバリエーションが含まれません。

SOCKSプロキシ・プロパティ

SOCKSプロキシはTCPレベルで動作するため、低レベルのトンネリングが可能です。SOCKSプロキシ・サーバーを指定すると、他のプロキシが指定されていないかぎり、すべてのTCP接続がそのプロキシ・サーバーを通過します。次のプロキシ設定がSOCKSプロトコル・ハンドラによって使用されます。

表10-6 SOCKSプロキシ・プロパティ

プロパティ デフォルト値 説明
java.net.socks.username デフォルト値なし 「SOCKSユーザー名およびパスワードの取得」を参照してください
java.net.socks.password デフォルト値なし 「SOCKSユーザー名およびパスワードの取得」を参照してください
socksProxyHost デフォルト値なし SOCKSプロトコル・ハンドラが使用するSOCKSプロキシ・サーバーです。
socksProxyPort 1080 SOCKSプロトコル・ハンドラが使用するポートです。
socksProxyVersion 5 サーバーでサポートされているSOCKSプロトコルのバージョン。デフォルトはSOCKS V5を示す5ですが、SOCKS V4を表す4も指定できます。これら以外の値にプロパティを設定すると、未指定の動作が発生します。
SOCKSユーザー名およびパスワードの取得

SOCKSユーザー名およびパスワードは次の方法で取得します:

  1. まず、アプリケーションがjava.net.Authenticatorのデフォルト・インスタンスを登録している場合、文字列SOCKS5に設定されたプロトコルと、文字列SOCKS authenticationに設定されたプロンプトで、デフォルト・インスタンスを問い合せます。
  2. オーセンティケータがユーザー名/パスワードを返さない場合や、オーセンティケータが登録されていない場合は、システムによってプロパティjava.net.socks.usernamejava.net.socks.passwordの値がチェックされます。
  3. これらの値が存在しない場合は、システム・プロパティuser.nameでユーザー名がチェックされます。この場合、パスワードは指定されません。

その他のプロキシ関連プロパティ

表10-7 その他のプロキシ関連プロパティ

プロパティ デフォルト値 説明
jdk.http.auth.proxying.disabledSchemes conf/net.propertiesを参照

HTTPのプロキシ時に無効になる認証スキームをリストします。

このプロパティの値は、関連するRFCで定義されている、大/小文字を区別しない認証スキーム名のカンマ区切りリストです。スキームには、BasicDigestNTLMKerberosおよびNegotiateが含まれます。不明またはサポートされていないスキームは無視されます。

一部の環境では、HTTPまたはHTTPSのプロキシ時に特定の認証スキームが望ましくない場合があります。たとえば、Basicを使用すると、物理ネットワーク上でユーザーのパスワードが実際にクリアテキストで送信されます。

jdk.http.auth.tunneling.disabledSchemes conf/net.propertiesを参照

HTTP CONNECTメソッドを使用してプロキシ経由でHTTPSをトンネリングするときに無効になる認証スキームをリストします。

このプロパティの値は、関連するRFCで定義されている、大/小文字を区別しない認証スキーム名のカンマ区切りリストです。スキームには、BasicDigestNTLMKerberosおよびNegotiateが含まれます。不明またはサポートされていないスキームは無視されます。

java.net.useSystemProxies false

trueに設定すると、オペレーティング・システムのプロキシ設定が使用されます。

java.net.useSystemProxiesがtrueに設定されている場合でも、http.proxyHostなどのプロキシを明示的に設定したシステム・プロパティがシステム設定よりも優先されることに注意してください。

このプロパティは起動時に1回のみチェックされます。

UNIXドメイン・ソケットのプロパティ

nullアドレス・パラメータを指定してServerSocketChannel.bindを呼び出すと、チャネルのソケットが自動的に割り当てられたソケット・アドレスにバインドされます。UNIXドメイン・ソケットの場合、これは事前定義されたシステムの一時ディレクトリ内の一意のパスを意味します。

次のプロパティを使用して、このディレクトリの選択を制御します:

表10-8 UNIXドメイン・ソケットのプロパティ

プロパティ デフォルト値 説明
java.io.tmpdir オペレーティング・システムによって異なる jdk.net.unixdomain.tmpdirシステム・プロパティで一時ディレクトリを特定できない場合は、java.io.tmpdirシステム・プロパティで指定されたディレクトリが使用されます。
jdk.net.unixdomain.tmpdir 一部のプラットフォーム(一部のUNIXシステムなど)では、事前にデフォルト値が定義されています。それ以外(Windowsなど)の場合、デフォルト値はありません。 自動バインドされたサーバー・ソケット・アドレスに使用するディレクトリを指定します。

LinuxおよびmacOSでは、このディレクトリを決定する検索順序は次のとおりです:

  1. システム・プロパティjdk.net.unixdomain.tmpdir (コマンドラインまたはSystem.setProperty(String, String)によって設定)
  2. $JAVA_HOME/conf/net.propertiesファイルに設定されている同じプロパティ
  3. システム・プロパティjava.io.tmpdir

Windowsでは、このディレクトリを決定する検索順序は次のとおりです:

  1. システム・プロパティjdk.net.unixdomain.tmpdir (コマンドラインまたはSystem.setProperty(String, String)によって設定)
  2. %JAVA_HOME%\conf\net.propertiesファイルに設定されている同じプロパティ
  3. TEMP環境変数
  4. システム・プロパティjava.io.tmpdir

UNIXドメイン・ソケット・アドレスの長さは(プラットフォームによっては)約100バイトに制限されているため、一時ディレクトリの名前とソケットに使用されるファイル名がこの制限を超えないようにすることが重要です。

ノート:

クライアント・ソケットがbindを呼び出さずにリモート宛先に接続されている場合、ソケットは暗黙的にバインドされます。この場合、UNIXドメイン・ソケットの名前はありません(つまり、そのパスは空です)。この動作は、システムまたはネットワークのプロパティの影響を受けません。

その他のHTTP URLストリーム・プロトコル・ハンドラのプロパティ

これらのプロパティは、起動時に1回のみチェックされます。

表10-9 その他のHTTP URLストリーム・プロトコル・ハンドラのプロパティ

プロパティ デフォルト値 説明
http.agent Java/<version> HTTPリクエストのUser-Agentリクエスト・ヘッダーで送信される文字列を定義します。文字列Java/<version>は、プロパティで指定された文字列に追加されます。

たとえば、-Dhttp.agent="example"が指定されている場合、JVMのバージョンが1.8.0であれば、User-Agentヘッダーにexample Java/1.8.0が含まれます。

http.auth.digest.cnonceRepeat 5 「HTTPダイジェスト認証メカニズムの動作を変更するシステム・プロパティ」を参照してください。
http.auth.digest.reEnabledAlgorithms デフォルト値なし デフォルトでは、特定のメッセージ・ダイジェスト・アルゴリズムが、実証されているセキュリティ制限のために、HTTPダイジェスト認証での使用が無効化されます。これは、プロキシ認証およびプレーン・テキストHTTPサーバー認証にのみ適用されます。無効化されたアルゴリズムは、HTTPSサーバー認証では引き続き使用できます。無効化されたアルゴリズムのデフォルト・リストは、java.securityプロパティ・ファイルに指定され、現在はMD5SHA-1で構成されています。これらのアルゴリズムの1つを引き続き使用する必要がある場合は、このプロパティをアルゴリズム名のカンマ区切りリストに設定すると、再度有効にできます。
http.auth.digest.validateProxy false 「HTTPダイジェスト認証メカニズムの動作を変更するシステム・プロパティ」を参照してください。
http.auth.digest.validateServer false 「HTTPダイジェスト認証メカニズムの動作を変更するシステム・プロパティ」を参照してください。
http.auth.ntlm.domain デフォルト値なし

他のHTTP認証スキームと同様に、New Technology LAN Manager (NTLM)は、必要に応じてjava.net.Authenticatorクラスを使用してユーザー名とパスワードを取得します。しかし、NTLMの場合はNTドメイン名も必要です。ドメインを指定するには、次の3つのオプションがあります。

  1. ドメインを指定しない。環境によっては、実際にはドメインが必要とされないので、アプリケーションで指定する必要がありません。
  2. ドメイン名は、ユーザー名の前にバックスラッシュ(\)を付けることで、ユーザー名内にエンコードできます。この方法では、ユーザーがこの表記方法を使用しなければならないということを意識すれば、Authenticatorクラスを使用する既存のアプリケーションを変更する必要がありません。
  3. ドメイン名を2番目のオプションで指定せず、システム・プロパティhttp.auth.ntlm.domainが定義されている場合、このプロパティの値がドメイン名として使用されます。
http.keepAlive true

永続(キープ・アライブ)接続をサポートするかどうかを示します。これを使用すると、複数のHTTP要求に対して再利用されるベースとなるソケット接続を許可することによって、パフォーマンスが改善されます。これがtrueに設定されている場合は、HTTP 1.1サーバーとの間で永続接続が要求されます。

永続接続の使用を無効にするには、このプロパティをfalseに設定します。

http.KeepAlive.queuedConnections 10 クリーンアップのためにキューに配置される最大キープ・アライブ接続数です。
http.KeepAlive.remainingData 512 再利用できるように、基礎となるソケットから削除されるデータの最大量(KB)です。
http.keepAlive.time.serverおよびhttp.keepAlive.time.proxy 5 これらのプロパティは、サーバー(またはプロキシ)でキープアライブ時間が指定されない場合に、HTTPキープアライブ・キャッシュの動作を変更します。このケースでプロパティが設定されると、指定の秒数の後でアイドル接続が閉じます。プロパティが設定され、さらにサーバーによってキープアライブ時間がKeep-Aliveレスポンス・ヘッダーに指定されると、サーバーによって指定された時間が使用されます。プロパティが設定されず、サーバーもキープアライブ時間を指定しない場合は、http.keepAliveがtrueであれば、実装で定義された期間にわたって接続が存続し続けます。
http.maxConnections 5 HTTP永続接続(http.keepAliveプロパティを参照)が有効な場合、この値によって、宛先ごとに同時に保持されるアイドル接続の最大数が決まります。
http.maxRedirects 20 特定の要求に関して、プロトコル・ハンドラが自動的に従うHTTPリダイレクトの最大数を決定する整数値。
jdk.https.negotiate.cbt never

TLSチャネル・バインディング・トークン(CBT)の生成および送信を制御します(HttpsURLConnectionによって、KerberosまたはKerberosを使用したNegotiate認証スキームがHTTPS上で使用される場合)。3通りの設定があります:

  • never: プロパティが設定されていない場合も、これがデフォルト値になります。この場合、CBTは送信されません。
  • always: CBTは、HTTPSを介したすべてのKerberos認証試行について送信されます。
  • domain:<comma-separated domain list>: リスト内の各ドメインは、CBTが送信される宛先ホストを指定します。指定できるドメイン:
    • exampleexample.comなどの単一ホスト
    • RFC 2732で指定されたリテラルIPアドレス
    • ワイルドカードを含むホスト名(*.example.comなど)。この例は、example.comおよびそのサブドメインのすべてのホストと一致します。

生成されるチャネル・バインディング・トークンは、RFC 5929で定義されているタイプtls-server-end-pointです。

jdk.http.ntlm.transparentAuth デフォルト値なし

Windowsで透過的なNew Technology LAN Manager (NTLM) HTTP認証を有効にします。

NTLMスキームには透過的認証を使用できます。このスキームでは、現在ログインしているユーザーの名前とパスワードに基づくセキュリティ資格証明を、ユーザーにプロンプトを表示せずにオペレーティング・システムから直接取得できます。

この値が設定されていない場合、透過的認証は行われません。

このプロパティには、次の3つの値があります:

  • disabled: 透過的認証は使用されません。
  • allHosts: 透過的認証はすべてのホストに使用されます
  • trustedHosts: 透過的認証は、Windowsインターネット設定で信頼されているホストに対して有効になります。

NTLMは厳密にセキュアな認証スキームではないため、有効にする前に注意してください。

HTTPダイジェスト認証メカニズムの動作を変更するシステム・プロパティ

システム・プロパティhttp.auth.digest.validateServerおよびhttp.auth.digest.validateProxyは、HTTPダイジェスト認証メカニズムの動作を変更します。ダイジェスト認証は、サーバーがユーザーのパスワードを認識していることをクライアントに証明することによって、サーバー自体をクライアントに認証させるための限定された機能をサーバーに提供します。しかし、すべてのサーバーがこの機能をサポートするわけではありません。また、デフォルトではこのチェックはオフに設定されています。オリジンでの認証に対してこのチェックを強制するには、http.auth.digest.validateServertrueに設定し、プロキシ・サーバーでhttp.auth.digest.validateProxytrueに設定します。

通常、システム・プロパティhttp.auth.digest.cnonceRepeatを設定する必要はありません。このプロパティは、cnonce値を再使用する回数を決定します。このプロパティは、MD5-sessアルゴリズムを使用する場合に役に立ちます。この値を増やすと、各HTTP要求のためにハッシュしなければならない情報の量が減るので、クライアントとサーバーの両方で計算のオーバーヘッドが減少します。

ホスト名からIPアドレスへのマッピングの指定

システム全体のリゾルバをデプロイすることで、ホスト名からIPアドレスへのマッピングをカスタマイズできます。詳細は、Java SE API仕様のInetAddressResolverProviderクラスを参照してください。本番ではない、テストなどの場合には、システム全体のリゾルバではなく、特定のhostsファイルを使用するようInetAddressを構成し、ホスト名をIPアドレスにマップできます。このhostsファイルは、システム・プロパティjdk.net.hosts.fileで指定します。

ノート:

テストには、特定のhostsファイルを使用します。ホスト名の完全なリストが必ず事前にわかるわけではないため、これは汎用的な解決策にはなりません。

デフォルトでは、システム・プロパティjdk.net.hosts.fileは設定されていません。設定されている場合、ネーム・サービス検索は、このシステム・プロパティに指定されたファイルから取得されます。このシステム・プロパティに存在しないファイルが指定されている場合、そのファイルは空のファイルとみなされ、名前/アドレス検索でUnknownHostExceptionがスローされます。

hostsファイルの構造は、LinuxまたはmacOSの/etc/hostsファイルに似ています。このテキスト・ファイルの各行は、次のような構文になっています:

IPAddress hostname [host aliases...]
  • IPAddress: IPアドレス
  • hostname: IPアドレスがマップされるホスト名
    • ホスト名には、英数字、ハイフン(-)およびピリオド(.)で構成される完全修飾ドメイン名(FQDN)の構文と構造が必要です。先頭および末尾は英数字であることが必要です。
    • 構文チェックまたはホスト名検証は実行されないことに注意してください。
  • [host aliases...]: ホスト別名のオプションのリスト

エントリのフィールドは、任意の数の空白(スペースおよびタブ)で区切られます。

数字記号(#)で始まり、行の最後までテキストが続くコメントは無視されます。

次に、hostsファイルの例を示します:

# sample jdk.net.hosts.file entries
127.0.0.1 localhost
127.0.0.1 host.rabbit.hole
127.0.0.1 c1.this.domain
192.0.2.0 testhost.testdomain
192.0.2.255 testhost2.testdomain

アドレス・キャッシュ・プロパティ

名前解決の実行時、java.netパッケージはセキュリティ上とパフォーマンス上の両方の理由で、アドレス・キャッシュを使用します。アドレス解決の試行は、前方解決(名前からIPアドレスへ)でも逆方向の解決(IPアドレスから名前へ)でもすべて、成功であったかどうかを問わず結果がキャッシュされます。そのため、以後の同一の要求はネーム・サービスにアクセスする必要がなくなります。これらのプロパティを使用すると、アドレス・キャッシュの動作を調整できます。

ノート:

次のプロパティはセキュリティ・ポリシーに含まれます。-DオプションまたはSystem.setProperty()メソッドによっては設定されません。かわりに、セキュリティ・プロパティとして設定されます。

表10-10 アドレス・キャッシュ・プロパティ

プロパティ デフォルト値 説明
networkaddress.cache.ttl -1

$JAVA_HOME/conf/security/java.securityファイルに指定され、ネーム・サービスによる成功した名前検索に対するキャッシング・ポリシーを示します。値は、成功した名前検索がキャッシュに保持される秒数に対応する整数です。

-1の値や、その他の負の値はすべて、「永久にキャッシュする」ことを意味します。0 (ゼロ)は、キャッシュを使用しないという意味です。

セキュリティ・マネージャがインストールされている場合のデフォルト値は-1 (永久)で、セキュリティ・マネージャがインストールされていない場合は実装固有となります。

networkaddress.cache.negative.ttl 10 $JAVA_HOME/conf/security/java.securityファイルに指定され、ネーム・サービスによる失敗した名前検索に対するキャッシング・ポリシーを示します。

値は、失敗した名前検索がキャッシュに保持される秒数に対応する整数です。-1の値や、その他の負の値はすべて、「永久にキャッシュする」ことを意味します。値0 (ゼロ)はキャッシュを使用しないという意味です。

拡張例外メッセージ

デフォルトでは、セキュリティ上の理由から、例外メッセージには、ホスト名やUNIXドメイン・ソケットのアドレス・パスなどの機密性の高いセキュリティ情報は含まれません。デバッグやその他の目的でこの制限を緩和する場合は、jdk.includeInExceptionsを使用します。

表10-11 拡張例外メッセージ・プロパティ

プロパティ デフォルト値 説明
jdk.includeInExceptions デフォルト値なし

値はキーワードのカンマ区切りリストで、メッセージが詳細情報で拡張される可能性がある例外タイプを参照します。

特に、値に文字列hostInfoが含まれている場合、ソケット・アドレスは例外メッセージ・テキスト(ホスト名やUNIXドメイン・ソケットのアドレス・パスなど)に含まれます。