获取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 ,端口的对应值,是大家以后遇到此类问题的不错解决方案。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值