我是靠谱客的博主 和谐小伙,最近开发中收集的这篇文章主要介绍获取ipv4、v6 地址,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前段时间项目有用到获取客户端请求的ip地址,随在网上搜了下大致的java实现过程,看到的都是通过请求中得到的ip地址,像request.getRemoteAddr()等获取方式,当考虑Apache,Squid等反向代理,多次代理会有多个ip,第一个才是真实的ip,大致的代码实现过程如下:
public static String getBrowIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
int port = request.getRemotePort();
if(ip != null && ip !="" && !"unKnown".equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(",");
if(index != -1){
return ip.substring(0,index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
if(ip != null && ip !="" && !"unKnown".equalsIgnoreCase(ip)){
return ip;
}
return request.getRemoteAddr();
}

此种方法虽然能实现所需要的功能,但有一个小缺陷,就是在win10系统中获取的地址为“0:0:0:0:0:0”,即是一个ipv6地址。
不得不重新想办法实现,在github中看到zipkin的开源项目,其中有一个实现地址的方式,就整理下,分享给大家。

     Endpoint produceLocalEndpoint() {
    Endpoint.Builder builder = Endpoint.newBuilder().serviceName("unknown");
    try {
      Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces();
      if (nics == null) return builder.build();
      while (nics.hasMoreElements()) {
        NetworkInterface nic = nics.nextElement();
        Enumeration<InetAddress> addresses = nic.getInetAddresses();
        while (addresses.hasMoreElements()) {
          InetAddress address = addresses.nextElement();
          if (address.isSiteLocalAddress()) {
            builder.ip(address);
            break;
          }
        }
      }
    } catch (Exception e) {
      // don't crash the caller if there was a problem reading nics.
      if (logger.isLoggable(Level.FINE)) {
        logger.log(Level.FINE, "error reading nics", e);
      }
    }
    return builder.build();
  }

此功能可以实现同时获取ipV4 ,ipV6 ,端口的对应值,是大家以后遇到此类问题的不错解决方案。

最后

以上就是和谐小伙为你收集整理的获取ipv4、v6 地址的全部内容,希望文章能够帮你解决获取ipv4、v6 地址所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部