HttpServletRequest getRemoteAddr()无法正常工作

时间:2012-08-22 20:02:54

标签: java servlets localhost

根据我的理解,以下代码返回错误:

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?

谢谢!

2 个答案:

答案 0 :(得分:4)

问题是这两个功能

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

答案 1 :(得分:2)

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

以下是有关IPv6 Zone Indices的更多信息。

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

InetAddress.getAllByName("localhost") 

没有。但是,我的建议是,如果您希望在localhost上匹配,则匹配两种模式,或者执行startsWith匹配。