7

私が理解していることから、次のコードは間違って返されます:

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")

私は以下を取得します:

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

getRemoteAddr() が無効な形式を返す場合、または何か間違ったことをしている場合、localhost をテストするにはどうすればよいですか?

ありがとう!

4

2 に答える 2

5

問題はこれらの2つの機能です

1)java.net.InetAddress.getAllByName(String)

2)javax.servlet.ServletRequest.getRemoteAddr()

非常に異なります。最初の関数は標準のJavaランタイムの一部であり、2番目の関数はJavaEEコンテナによって実装されます。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を参照してください。

于 2012-08-22T22:06:21.893 に答える
3

0:0:0:0:0:0:0:1%0IPv6 localhost の有効な長い形式です。は%0、オプションのゾーン インデックスを指定します。

IPv6 ゾーン インデックスの詳細については、こちらをご覧ください。

httpRequest.getRemoteAddr();の呼び出しがオプションのゾーン インデックス %0 を返す理由がわかりません。

InetAddress.getAllByName("localhost") 

ではない。ただし、localhost で一致させたい場合は、両方のパターンで一致させるか、startsWith 一致を実行することをお勧めします。

于 2012-08-22T20:22:13.330 に答える