HttpServletRequest getRemoteAddr()无法正常工作 [英] HttpServletRequest getRemoteAddr() not working how I would expect

查看:389
本文介绍了HttpServletRequest getRemoteAddr()无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据我的理解,以下代码未正确返回:

The following code is returning incorrectly, from what I understand:

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吗?当我遍历

Any idea why the %0 is there? When I loop through

InetAddress.getAllByName("localhost")

我得到以下信息:

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

如果getRemoteAddr()返回的格式无效,或者我做错了什么,我该如何测试本地主机?

How would I test for localhost if getRemoteAddr() is returning invalid format, or am I doing something wrong?

谢谢!

推荐答案

问题是这两个函数

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

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

2)javax.servlet.ServletRequest.getRemoteAddr()

2) javax.servlet.ServletRequest.getRemoteAddr()

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

Are very different. The first function is part of the standard Java runtime and the second is implemented by your Java EE container. You are using Tomcat7 so the optional zone parameter %0 is being added.

最重要的是,您不应像现在那样在IP地址上进行字符串比较.

Bottom line, you should not be doing string comparison on ip addresses like you are.

您真正应该做的是使用org.apache.catalina.filters.RemoteIpFilter.这可以按照您定义的方式来完成您想做的事情.

What you should really be doing is using the org.apache.catalina.filters.RemoteIpFilter. This does what you are trying to do in a well defined way.

示例:

<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 了解更多信息.

See http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_IP_Filter for more info.

这篇关于HttpServletRequest getRemoteAddr()无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆