失敗
HttpServletRequest#getRemoteAddr メソッドで IP アドレスを取得したところ、「0:0:0:0:0:0:0:1」のような IPv6 形式になっていました。
IPv4 形式で取得するには、どのようにすればよいのでしょうか?
環境
このレポートは、以下の環境について記述したものです。
| JDK | Java SE Development Kit 6 Update 16 |
| AP サーバ | Tomcat 6.18 |
原因
Java では IPv6 がサポートされている場合、デフォルトで IPv6 を使用することになっています。 このため、getRemoteAddr メソッドで取得した IP アドレスが IPv6 形式になっていたのです。
Java における IPv6 のサポート状況を、下表に示します。
| OS | JDK / JRE |
|---|---|
| Soralis 8 以降 | J2SE 1.4 以降 |
| Linux カーネル 2.1.2 以降 | J2SE 1.4 以降 |
| Windows XP SP1 以降 | Java SE 5.0 以降 |
解決策
IPv4 を優先させるには、システムプロパティに java.net.preferIPv4Stack=true を設定する必要があります。 以下に、システムプロパティの設定例を 2 つ示します。
■ Linux + Tomcat の場合
環境変数 JAVA_OPTS の値として指定します。
export PATH=/bin:
export CATALINA_HOME=/opt/web/apache-tomcat-6.0.18
export JAVA_OPTS='-Djava.net.preferIPv4Stack=true'
export CATALINA_OPTS="-server -Xmx512M -Xms64M"
cd /bin/startup.sh
■ Eclipse 3.5 (WTP) + Tomcat の場合
WTP では、サーバの起動設定ごとに指定する必要があります。
- メニューから「Run」-「Run Configurations...」をクリックします。
- 「Run Configurations」ダイアログから、対象となる「Apache Tomcat」の起動設定をクリックします。
- 「Arguments」タブを選択し、「VM arguments」の末尾に -Djava.net.preferIPv4Stack=true を追加します (図1) 。
- 「Apply」ボタンをクリックします。
なお、「VM arguments」には、他のシステムプロパティ (catalina.base など) が指定されているので、それらを消さないようにご注意ください。
参考サイト
- Java EE 5 API Specifications - javax.servlet.ServletRequest#getRemoteAddr
- JDK 6 ドキュメント - IPv6 関連のシステムプロパティー
