我用的一个获取ip的笨方法就是访问获取ip的网页,例如ip138,然后再网页源码中截取自身的ip。

解决方案 »

  1.   

    那个API是根据host里配置的计算机名来取IP的,实际上如果你要绑定服务的话,是不用取IP的,直接绑定端口就好了,操作系统会把你的服务绑定到服务器上所有对外的网卡上
      

  2.   

    public static String getIpAddr(HttpServletRequest request) {
    String ip = request.getHeader("x-forwarded-for");
    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.equals("0:0:0:0:0:0:0:1")) {
    ip = "localhost";
    }
    return ip;
    }
    获取ip是这样获取的
      

  3.   

    可以参考一下我的博客
    http://ygydaiaq-gmail-com.iteye.com/blog/1985820
      

  4.   

    用request获取浏览器上ip,这是个本方法
      

  5.   

    remoteaddr是访问浏览器所在的ip,不是服务器端ip。先说说你取服务器ip要做什么呢
      

  6.   


    谢谢不过为什么要多吃次getheader()呢
      

  7.   


    谢谢不过为什么要多吃次getheader()呢你看header头是不一样,是代理还是什么的
      

  8.   

    楼上那些获取ip的判断很啰嗦,同一个条件用了那么多次,无语.
    在互联网业务中,很多时候我们需要获取客户端浏览器实际访问的IP地址,但现在很多网友都是通过代理上网的,如果这时我们在java中用request.getRemoteAddr()去或取ip地址,得到的只是客户端使用代理后的ip地址,也有可能是加上代理后几层的ip,
    需要注意的是X-Forwarded-For和X-Real-IP都不是http的正式协议头,而是squid等反向代理软件最早引入的,之所以resin能拿到,是因为NGINX里一般缺省都会这么配置转发的http请求:
    location / {
             proxy_pass       http://yourdomain.com;
             proxy_set_header   Host             $host;
             proxy_set_header   X-Real-IP        $remote_addr;
             proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
             },从X-Forwarded-For的定义来看,ips[0]才是原始客户端ip,如果这个都不是,那拿第二个就更不靠谱了,我们平时检验的时候,可能是直接在内网挂代理去访问的,跟外面网友访问经过的网络路径不一样,后面不停添加的是经过的每一层代理ip才对,下面举例说明;
    request.getRemoteAddr() 192.168.239.196
    request.getHeader("X-Forwarded-For") 58.63.227.162, 192.168.237.178, 192.168.238.218
    request.getHeader("X-Real-IP") 192.168.238.218
    所以访问的流程应该是这样,客户端58.63.227.162发出请求,经过192.168.237.178, 192.168.238.218两层转发,到了192.168.239.196这台NGINX上,NGINX就把X-Real-IP头设成了自己看到的remote_addr,也就是直接发给到他的192.168.238.218,这时候resin收到这个包,对resin来说直接发给他的remote_addr就是NGINX的ip,也就是192.168.239.196,那么resin里面的request.getRemoteAddr()就是192.168.239.196,那么在resin里拿最原始的ip逻辑(也就是拿能够知道的最外层的ip)应该是这样:
                如果XFF不为空,拿XFF的左边第一个
                如果XFF为空,拿XRI
                如果XRI为空,只能拿request.getRemoteAddr(),也就是只能拿到最直接      发给他的机器ip了,