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.结果展示

相关推荐
深念Y11 分钟前
局域网 HTTP 请求转发 502 问题排查记录
网络·网络协议·http·网络安全·代理·转发·中转
fīɡЙtīиɡ ℡18 分钟前
LLM/Agent 安全实战核心要点总结
网络·数据库·安全
2501_9160074721 分钟前
免费抓包工具 Windows 和 Mac 怎么选?根据平台来选择工具
网络协议·计算机网络·网络安全·ios·adb·https·udp
Fnetlink138 分钟前
解析SDWAN供应商光联世纪口碑佳的原因
网络·人工智能·安全
民乐团扒谱机1 小时前
【读论文】基于数字极大似然估计过程增强113公里O-TWTFT链路的时间传递
网络·论文笔记·量子·阅读笔记
网安小学生(兼顾数据库版)1 小时前
从固件上传到合规报告:艾体宝ONEKEY实现CRA合规的操作实录
网络·安全·web安全
mengge.cloud1 小时前
云计算&服务器基础小白教程
android·linux·运维·服务器·网络·云计算
Multipath7121 小时前
多链路聚合设备-应急指挥车实战通信保障方案
网络·5g·安全·智能路由器·实时音视频
Raas1001 小时前
AI网关是做什么的?MAI Gateway (魔芋企业级AI网关)给出企业级答案
网络·人工智能·gateway·企业级·ai网关·mai gateway·魔芋
星夜夏空991 小时前
网络编程(5)—— Reactor实现(v2)
网络