解决方案 »

  1.   

    JAVA API中就那么点函数/接口。所以怀疑要么是其调用了其他的接口,但是归根结底需要一个真正解析到真实IP的服务,这不得而知。。
      

  2.   

    这个服务要如何实现呢,还是有现成的包可以用?看看ip138是否开放API
      

  3.   

    request.getHeader("x-forwarded-for");
    request.getHeader("Proxy-Client-IP");
    request.getHeader("WL-Proxy-Client-IP");网上抄的,试试看
      

  4.   

    谢谢你的回答,我在第二副图片已经把这几个的值贴出来了,不知道大家都是怎么获取用户正确IP的呀,ip138的有点高级?
      

  5.   

    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");
            if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
                ip = request.getHeader("Proxy-Client-IP");
            if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
                ip = request.getHeader("WL-Proxy-Client-IP");
            if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
                ip = request.getRemoteAddr();
            if(ip.indexOf(",") > -1)
                ip = ip.substring(0, ip.indexOf(","));
            return ip;
        }
      

  6.   

    楼上的好强大,该有的方法全用上了.要是这样还取不到,那就放弃用java api带的方法来取吧
      

  7.   

    楼上的好强大,该有的方法全用上了.要是这样还取不到,那就放弃用java api带的方法来取吧图2中的请求头是我遍历getHeaderNames获得的,显然请求头中并没有Cdn-Src-Ip之类的东西,难道getHeaderNames返回的并不是所有请求头名称集合,有部分不常见的请求头就算发给了服务器也不会包含在getHeaderNames返回的对象中(没验证过,不过猜也没这么脑残)?
    感情真的要“弃用java api带的方法”,这个要怎么弄呢?
      

  8.   

    asp代码:
    userip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") 
    If userip = "" Then userip = Request.ServerVariables("REMOTE_ADDR")
      

  9.   

    这个问题实在是简单到不能简单:完全依赖公网服务器本身的特性决定的,ip138和你一样,什么都没有做,他之所以可以获取到某些网络环境的真实ip地址,仅仅只是他的服务器处于的机房不同,物理连接不同而已。具体来说就是,多线路机房获取到的真实外网ip概率要大很多,而且我告诉你,绝大多数国外服务器也能获取到更大范围内的真实外网ip。我本人能够通过编程实现任意网络环境做公网服务器而能获取到比目前你能看到的任何获取用户外网服务器的网站更准确的ip. 我基本能实现自我感知自己的外网ip是哪一个,你给我一个ip,我能判断他究竟可不可能是我的真实外网ip.
      

  10.   

    到目前为止,我都只看到依赖公网服务器本身看到用户访问过来的ip作为用户的外网ip,你看到不同的网站显示出来的ip可能不一致,有的可能是对的,有的可能是错的,这些都是完全由网站服务器本身的物理链路不同导致的,都还没像我这样通过编程去实现判断和去感知我的外网ip究竟应该是什么。在这个问题上确实是有文章可以做,但我还没看到谁这么做过,基于网页的做法几乎是不可能做这个事情的。
      

  11.   

    不明觉厉,太底层的东西小白看了也不太懂,透过透明代理,在正常情况下获取到的IP是代理服务器的,从百度加速乐那查到的结果可以证明,然而ip138却真真实实获取到了我路由上的IP,会不会是代理服务器请求ip138时用了不同的策略(比如发送了X_FORWARDED_FOR请求头),走了不同的线路(比如客户端和ip138直连)?我写的很清楚了,代理服务器没有发送X_FORWARDED_FOR请求头(asp的ServerVariables的确很脑残的,明明发送的X_FORWARDED_FOR却要用HTTP_X_FORWARDED_FOR这个名字来获取)欢迎围观^^
      

  12.   

    走什么线路根本就无法由用户程序来调度,只能是路由器本身的路由来决定,而软件代码(包括网页)根本就不可能有什么方法来左右路由器的路由。换为多线服务器机房,你可能就能看到你真实ip,你用国外的查自己的ip的网站,也可能能看到自己的真实外网ip.  但这些都是针对这个服务器而言,你的外网ip是什么。 至于究竟是不是真实的,则不太好说。也就是都还停留在看的阶段,只是自己的位置不同(物理线路不同)看到的可能有区别,有的可能看到的是对的。 本质上这个问题可以 思。 也就是我能做的那样,我可以思考我的真实外网ip是什么,而不是完全凭某一个服务器看到的外网ip.
      

  13.   

    学习一下大伙的获取用户IP的方法,不知道ip138是怎么实现的
      

  14.   

    刚ping了一下ip138.com,本地和服务器的结果不一样,把我电脑的本地连接dns改成和服务器的一样,拼出来的结果就一样了,小白就是小白总有千奇百怪的问题,迷茫了可能真像你说的,不同地方看到的IP有可能不一样
      

  15.   

    通过楼主的实验可知,ip138支持从X-Forwarded-For判断ip来源,而“百度加速IP归属地”获取到了“错误”的ip来源。那么情况很有可能是这样的,你的代理服务器添加了X-Forwarded-For头,如果你的包本来就有X-Forwarded-For头,那么代理服务器不覆盖你的配置。仅仅抓包是看不出来这一点的,因为你只能抓到你发出的包,无法查看ip138收到的包。可以另找一人有外网ip的,让他开一个http服务,然后你访问一下,在对方处抓一下包,一切就都真相大白了。真相可能是:你的WAN口ip是A,运营商的代理服务器ip是B,那么对方收到的包的来源地址是B,包中某个地方标识出了真正的来源地址是A这可能是运营商应对ip地址资源不足的策略
      

  16.   


    这个高级了,还要抓包分析,小白完全不会弄啊
    不过我服务器是人家的vps,公网的IP,收到的请求确实没有X-Forwarded-For请求头
    “包中某个地方标识出了真正的来源地址是A”,不知道有没有什么java api支持获取这方面的信息,不然这潭水就深了去了
      

  17.   

    JAVA API获取客户IP地址真的很困难。
      

  18.   

    联系我 我配合你做这个测试,连接我的外网ip,我抓包来看。本地发给ip138的包没有任何特别的,我看过了
      

  19.   


    嗯,比如通过IP来限制用户访问频率,首先得正确获取到用户IP,极端情况下,好多人无缘无故变成同一个IP,又同时访问网站,nginx的连接限制,limit_conn_zone $binary_remote_addr这种配置就有点显得不太友好,然而ip138确实获取到了正确IP就不用担心这种情况了,好奇他们是怎么实现的