java如何获取IP和IP的归属地?

在Java中,获取IP地址通常指的是获取本地机器的IP地址或者通过某种方式(如HTTP请求)获取的远程IP地址。代码案例如下:

而要获取IP的归属地(地理位置信息),则通常需要使用第三方IP地址查询服务,我这里使用的是 ip2region开源IP库。代码操作步骤如下:

1.导入ip2region库:

2.在pom文件中包含该目录下的对应资源

3.根据IP获取归属地

java 复制代码
public static String getAddressLog(String userPhone, String ip) {
    try {
        HttpServletRequest request = RequestUtil.getRequest();
        log.info("======> 获取客户端IP地址:clientIP:{}", ip);
        if (StrUtil.isBlank(ip)) {
         log.error("获取用户ip失败,用户手机号 = " + userPhone);
        } else {
          IpLocation ipLocation = IPUtil.getLocation(ip);
          if (ObjectUtil.isNotNull(ipLocation.getProvince())) {
              //根据业务需求来确定需要定位到省还是省-市,我这里就直接是定位到省
              String address = ipLocation.getProvince();
              log.info("======> IP解析后的地址信息:{}", address);
              //注意:如果是内网IP的话,这里将查询不到归属地,而会返回内网,
              //这里如果是内网IP就直接处理变成广东省。
              if (StringUtils.isNotEmpty(address)){
                 return address.contains("内网") ? "广东省" : address;
              }
           }
         }
     } catch (Exception e) {
       log.error("通过ip获取用户位置失败,用户phone = {}", userPhone);
       log.error("通过ip获取用户位置失败,e = {}", e);
     }
}

 /**
     * 根据iP获取归属地信息
     */
public static IpLocation getLocation(String ip) {
   IpLocation location = new IpLocation();
   location.setIp(ip);
   try (InputStream inputStream = IPUtil.class.getResourceAsStream("/ipdb/ip2region.xdb");) {
     byte[] bytes = IoUtil.readBytes(inputStream);
     Searcher searcher = Searcher.newWithBuffer(bytes);
     String region = searcher.search(ip);
     log.info("============> region:{}", region);
     if (StrUtil.isNotBlank(region)) {
       // xdb返回格式 国家|区域|省份|城市|ISP,
       // 只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0
       String[] result = region.split("\\|");
       location.setCountry(ZERO.equals(result[0]) ? StrUtil.EMPTY : result[0]);
       location.setProvince(ZERO.equals(result[2]) ? StrUtil.EMPTY : result[2]);
       location.setCity(ZERO.equals(result[3]) ? StrUtil.EMPTY : result[3]);
       location.setIsp(ZERO.equals(result[4]) ? StrUtil.EMPTY : result[4]);
      }
            searcher.close();
   } catch (Exception e) {
      e.printStackTrace();
      return location;
   }
   return location;
}

4.结果展示

相关推荐
千天夜1 分钟前
深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解
网络·人工智能·深度学习·神经网络·yolo·机器学习
茶颜悦色vv24 分钟前
Wireshark(1)
网络·web安全·网络安全·wireshark
ascarl201025 分钟前
【Nginx系列】---Nginx配置tcp转发
运维·tcp/ip·nginx
我叫czc39 分钟前
【Python高级353】python实现多线程版本的TCP服务器
服务器·python·tcp/ip
xianwu5431 小时前
反向代理模块。开发
linux·开发语言·网络·c++·git
brhhh_sehe1 小时前
重生之我在异世界学编程之C语言:深入文件操作篇(下)
android·c语言·网络
忆源1 小时前
Linux高级--2.4.2 linux TCP 系列操作函数 -- 深层理解
linux·网络·tcp/ip
哈利巴多先生1 小时前
HTTP,续~
网络·网络协议·http
白了个白i1 小时前
http的访问过程或者访问页面会发生什么
网络·网络协议·http
赛德乌漆麻黑哟2 小时前
FOFA--网络空间资产搜索引擎(常用语法以及拓展)
网络·安全·搜索引擎