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

问题是这两个功能

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

2) javax.servlet.ServletRequest.getRemoteAddr()

非常不同。第一个函数是标准 Java 运行时的一部分,第二个函数由 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

于 2012-08-22T22:06:21.893 回答
3

0:0:0:0:0:0:0:1%0是 IPv6 localhost 的有效长格式。%0指定可选区域索引 。

这是有关IPv6 区域索引的更多信息。

我不知道为什么调用httpRequest.getRemoteAddr();返回 %0 的可选区域索引,并且

InetAddress.getAllByName("localhost") 

才不是。但是,我的建议是,如果您要在 localhost 上进行匹配,请同时匹配两种模式,或者进行 startsWith 匹配。

于 2012-08-22T20:22:13.330 回答