Servlet - getRemoteAddr による IPv4 アドレスの取得

失敗

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 JAVA_HOME=/opt/web/jdk1.6.0_16
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 の場合

Dolteng で SAStruts + Mayaa + S2JDBC を組み合わせたプロジェクトを作成
図1 WTP にシステムプロパティを設定

図1 WTP にシステムプロパティを設定

WTP では、サーバの起動設定ごとに指定する必要があります。

  1. メニューから「Run」-「Run Configurations...」をクリックします。
  2. 「Run Configurations」ダイアログから、対象となる「Apache Tomcat」の起動設定をクリックします。
  3. 「Arguments」タブを選択し、「VM arguments」の末尾に -Djava.net.preferIPv4Stack=true を追加します (図1) 。
  4. 「Apply」ボタンをクリックします。

なお、「VM arguments」には、他のシステムプロパティ (catalina.base など) が指定されているので、それらを消さないようにご注意ください。

参考サイト

コメント

コメント投稿
(非公開)
     « アイコン一覧 »
(必須)

作成日:2009/03/18
更新日:2009/03/18