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匹配。