2012-08-22 9 views
6

次のコードは、私が理解から、間違って戻っている期待どのように動作していない:のHttpServletRequest getRemoteAddr()私は

HttpServletRequest httpRequest = (HttpServletRequest) request; 
String userIPAddress = httpRequest.getRemoteAddr(); 

// Actual 
// "0:0:0:0:0:0:0:1%0" 

// Expected 
// "0:0:0:0:0:0:0:1" 

% 0がある理由を任意のアイデアを?いつ以下の私が取得

InetAddress.getAllByName("localhost") 

をループ:getRemoteAddr()が無効な形式を返しているか、私は何か間違ったことをやっている場合

// ["192.168.100.1", "127.0.0.1", "0:0:0:0:0:0:1"] 

にはどうすればローカルホストをテストするのでしょうか?

ありがとうございます!

答えて

4

問題は、これら二つの機能

1)java.net.InetAddress.getAllByName(文字列)

2)javax.servlet.ServletRequest.getRemoteAddr()

あります非常に異なっています。最初の関数は標準のJavaランタイムの一部であり、2番目の関数はJava EEコンテナによって実装されています。 Tomcat7を使用しているため、オプションのゾーンパラメータ%0が追加されています。

ボトムラインの場合、あなたのようにIPアドレスで文字列比較を行うべきではありません。

あなたが実際に行うべきことは、org.apache.catalina.filters.RemoteIpFilterを使用しています。これは、明確に定義された方法であなたがしようとしていることをします。

例:

<filter> 
    <filter-name>RemoteIpFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class> 
    <init-param> 
    <param-name>allowedInternalProxies</param-name> 
    <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value> 
    </init-param> 
    <init-param> 
    <param-name>remoteIpHeader</param-name> 
    <param-value>x-forwarded-for</param-value> 
    </init-param> 
    <init-param> 
    <param-name>remoteIpProxiesHeader</param-name> 
    <param-value>x-forwarded-by</param-value> 
    </init-param> 
    <init-param> 
    <param-name>protocolHeader</param-name> 
    <param-value>x-forwarded-proto</param-value> 
    </init-param> 
</filter> 

は、詳細はhttp://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_IP_Filterを参照してください。

+0

+1の2つの方法の実行のためのJavaランタイムとコンテナについての良い情報/考え。 –

+0

ありがとうフィリップ。 –

2

0:0:0:0:0:0:0:1%0は、IPv6ローカルホストの有効な長い形式です。 %0には、オプションのゾーンインデックスが指定されています。

ここにはIPv6 Zone Indicesに関するさらに詳しい情報があります。

httpRequest.getRemoteAddr();への呼び出しは%0のオプションのゾーンインデックスを返して、なぜ私は知らない、と

InetAddress.getAllByName("localhost") 

はしていません。しかし、私のお勧めは、あなたがlocalhost上でマッチするように見ているならば、両方のパターンで一致するか、startsWithマッチを行うことです。

+0

これは知っておきたいことです。彼らが異なる結果を返すのは奇妙です。私は、しかし、包含やstartsWithをチェックしたいと思いません。あまりにも多くの奇妙な状況:192.168.100.1> 192.168.100.12など – andrewpthorp

+1

InetAddressのドキュメントには「スコープインデックスが含まれている可能性がある」と記載されていますので、そのような喜びはありません... http://download.java.net/jdk7/archive/b123/ docs/api/java/net/InetAddress.html#getAllByName%28java.lang.String%29 – Alfabravo

+0

「どちらのパターンでも一致するか、startsWithで一致する」と言いましたが、少し曖昧でした。私に明確にさせてください。あなたの質問には、末尾の '%0'のために一致することができないと特に言及されました。 IPv6アドレスを照合するには、オプションのゾーンインデックスを無視し、 '0:0:0:0:0:0:0:1'にマッチさせるだけです。このオプションのゾーンインデックスはOSに依存します。例えば、Linuxでは、IPv6ループバックは '0:0:0:0:0:0:0:1%eth0'であり、Windowsでは' 0:0:0:0:0:0:0: 1%0' –

関連する問題