根据我的理解,以下代码返回错误:
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?
谢谢!
答案 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匹配。