老调重谈:获取用户IP,ip138能够获取到真实的IP
最近在弄nginx反向代理,引发了对获取用户IP的深入学习(以前发的帖子都没有满意结贴,没的返还50%积分,还有编辑器难用,抱怨一下)。
我在北京用的是宽带通的宽带,他们肯定有自己的服务器(缓存啥的,我也不懂的),请求网站的时候,肯定是通过他们的服务器的,而且是匿名代理,这一点通过下面贴出来的服务器接收的请求头可以看出来。
这样就导致了获取的用户IP是宽带提供商的服务器IP地址,而不是宽带提供商分配给用户的IP地址。
经过测试,得出下面这些数据:
1、223.21.65.225 宽带提供商给路由器分配的IP地址(真实IP)
2、118.186.134.251 服务器端收到用户的IP地址(代理服务器IP)
3、118.186.134.251 百度加速乐查询到用户的IP地址(代理服务器IP)
4、223.21.65.225 ip138.com查询到的IP地址(真实IP)
5、访问ip138.com时,携带X-Forwarded-For=2.2.2.2请求头,难么查询到的IP就2.2.2.2(虚假IP)
在程序里我用getRemoteAddr,getHeaders("X-Forwarded-For")均无法获取到真实IP地址,百度加速乐也没有正确获取到,由此我纳闷ip138是如何的到我真实IP的,还是有什么新的获取IP地址的方法?请csdn各位牛人指教
****以下是图片,供参考****
宽带提供商给路由器分配的IP地址223.21.65.225:
服务器端收到的IP地址118.186.134.251:
其中并没有X-Forwarded-For请求头,因此我判断是通过了透明代理(宽带通服务器),没获取到真实的IP地址。
验证一下,通过百度加速IP归属地查询获取到地址118.186.134.251:
和我获取的IP地址是一样的,并不是我真实的IP地址。
但是ip138却获取到了我真实的IP地址223.21.65.225:
(http://iframe.ip138.com/ic.asp,他什么也没做,请求了就直接返回IP地址,因此我截源码的图片)
结果是ip138确实获取到了我的IP地址。
验证一下,我添加X-Forwarded-For请求头,然后访问ip138,IP2.2.2.2:
------解决方案--------------------JAVA API中就那么点函数/接口。
所以怀疑要么是其调用了其他的接口,但是归根结底需要一个真正解析到真实IP的服务,这不得而知。。
------解决方案--------------------
看看ip138是否开放API
------解决方案--------------------request.getHeader("x-forwarded-for");
request.getHeader("Proxy-Client-IP");
request.getHeader("WL-Proxy-Client-IP");
网上抄的,试试看
------解决方案--------------------public static String getUserIp(HttpServletRequest request)
{
String ip = request.getHeader("Cdn-Src-Ip");
if(ip == null
------解决方案-------------------- ip.length() == 0
------解决方案-------------------- "unknown".equalsIgnoreCase(ip))
ip = request.getHeader("X-Forwarded-For");
if(ip == null
------解决方案-------------------- ip.length() == 0
------解决方案-------------------- "unknown".equalsIgnoreCase(ip))
ip = request.getHeader("X-Real-IP");