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

我得到以下内容:

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

如果getRemoteAddr()返回无效格式,或者我做错了什么,我将如何测试localhost?

谢谢!

问题是这两个function

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

2)javax.servlet.ServletRequest.getRemoteAddr()

非常不同。 第一个函数是标准Java运行时的一部分,第二个函数是由Java EE容器实现的。 您正在使用Tomcat7,因此正在添加可选的区域参数%0。

最重要的是,你不应该像你一样在ip地址上进行字符串比较。

你应该做的是使用org.apache.catalina.filters.RemoteIpFilter 。 这就是你要以明确定义的方式做的事情。

例:

  RemoteIpFilter org.apache.catalina.filters.RemoteIpFilter  allowedInternalProxies 192\.168\.0\.10|192\.168\.0\.11   remoteIpHeader x-forwarded-for   remoteIpProxiesHeader x-forwarded-by   protocolHeader x-forwarded-proto   

有关详细信息,请参阅http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_IP_Filter 。

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

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

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

 InetAddress.getAllByName("localhost") 

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