日期:2014-05-17  浏览次数:20931 次

老调重谈:获取用户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的服务,这不得而知。。
------解决方案--------------------
引用:
Quote: 引用:

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