wxm106
wxm106
2015-08-28 05:34

java后台获取客户端外网ip

  • ip

下面就是我用过的办法,但是都没作用,都是获得的内网ip

public static String getRealIp() throws SocketException {
String localip = null;// 本地IP,如果没有配置外网IP则返回它
String netip = null;// 外网IP

    Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
    InetAddress ip = null;
    boolean finded = false;// 是否找到外网IP
    while (netInterfaces.hasMoreElements() && !finded) {
        NetworkInterface ni = netInterfaces.nextElement();
        Enumeration<InetAddress> address = ni.getInetAddresses();
        while (address.hasMoreElements()) {
            ip = address.nextElement();
            if (!ip.isSiteLocalAddress()
                    && !ip.isLoopbackAddress()
                    && ip.getHostAddress().indexOf(":") == -1) {// 外网IP
                netip = ip.getHostAddress();
                finded = true;
                break;
            } else if (ip.isSiteLocalAddress()
                    && !ip.isLoopbackAddress()
                    && ip.getHostAddress().indexOf(":") == -1) {// 内网IP
                localip = ip.getHostAddress();
            }
        }
    }

    if (netip != null && !"".equals(netip)) {
        return netip;
    } else {
        return localip;
    }
}

public 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.getHeader("HTTP_X_FORWARDED_FOR");
       }
    if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }
    ip = request.getHeader("X-Real-IP");
    if(StringUtils.isNotEmpty(ip) && !"unKowm".equalsIgnoreCase(ip)) {
        return ip;
    }
    //    多个路由是,取得第一个非unknown的ip
    final String[] arr = ip.split(",");
    for(final String str : arr) {
        if(!"unknown".equalsIgnoreCase(str)) {
            ip = str;
            break;
        }
    }
    return ip;
}
  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

1条回答

为你推荐