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

news2024/10/6 22:26:50

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

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

1.导入ip2region库:

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

3.根据IP获取归属地

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1688316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA |再谈接口、Object、内部类】Object类中子类重写,Cloneable 接口、比较器、内部类

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈 ✨✨ 帅哥美女们,我们共同加油!一起…

element-plus:踩坑日记

el-table Q:有fixed属性时,无数据时,可能出现底部边框消失的bug 现象: 解决方法: .el-table__empty-block {border-bottom: 1px solid var(--el-table-border-color); } el-collapse 折叠面板 Q:标题上…

Java操作Word文档,根据模板生成文件

Java操作Word文档 poi-tl介绍 官方文档:https://deepoove.com/poi-tl/ poi-tl(poi template language)是Word模板引擎,使用模板和数据创建很棒的Word文档。 在文档的任何地方做任何事情(Do Anything Anywhere&#…

在全志H616核桃派开发板上配置I2C引脚并读取温度数据

配置引脚 找到板子上的i2c引脚 为了方便查找,我们加入了一个显示功能引脚位置的功能,运行以下命令,查看板子的40pin引脚上有几个可用i2c gpio pin i2c启用i2c 我们使用set-device指令来使能/关闭指定设备的底层驱动,使能后&am…

视频汇聚/云存储/安防监控EasyCVR接入GB28181设备未回复ack信息的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。 用户反馈,设备通过国标GB28181注…

Docker 容器间通讯

1、虚拟ip/访问 同一网络 安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间(包括宿主机)可以根据分配的ip互相访问(ps:其他主机(包括其他主机的容器)无法ping通docker容器ip无法访问&#…

RepOptimizer原理与代码解析(ICLR 2023)

paper:Re-parameterizing Your Optimizers rather than Architectures offcial implementation:https://github.com/dingxiaoh/repoptimizers 背景 神经网络的结构设计是将先验知识融入模型中。例如将特征转换建模成残差相加的形式(\(yf(x…

Zoho CRM怎么样?云衔科技为企业提供采购优惠!

企业对于客户关系管理(CRM)系统的需求日益增加,Zoho CRM作为一款备受赞誉的国际CRM服务提供商,凭借其全面的功能、出色的用户体验和卓越的性价比,成为了众多企业数字化转型的得力助手。 Zoho CRM是一款覆盖客户全生命…

Vue状态管理深度剖析:Vuex vs Pinia —— 从原理到实践的全面对比

🔥 个人主页:空白诗 文章目录 👋 引言📌 Vuex 基础知识核心构成要素示例代码 📌 Pinia 基础知识核心构成要素示例代码 📌 Vuex与Pinia的区别📌 使用示例与对比📌 总结 👋…

Transormer(2)-位置编码

位置编码公式 偶数位置用sin,奇数位置用cos. d_model 表示token的维度;pos表示token在序列中的位置;i表示每个token编码的第i个位置,属于[0,d_model)。 torch实现 import math import torch from torch import nn from torch.autograd im…

Vue 3 的 setup语法糖工作原理

前言 我们每天写vue3项目的时候都会使用setup语法糖,但是你有没有思考过下面几个问题。setup语法糖经过编译后是什么样子的?为什么在setup顶层定义的变量可以在template中可以直接使用?为什么import一个组件后就可以直接使用,无需…

【如何让论文中摘要后面的内容不出现在目录中】

首先选择摘要二字,设置为一级标题,然后选择摘要后面的内容设置为正文样式,再选择这一部分看一下是不是都是正文大纲级别,如果是那就可以了。 具体流程如下 1、选择摘要二字,设置为一级标题样式 2、选择摘要后面的文…

FreeRTOS学习——FreeRTOS队列(下)之队列创建

本篇文章记录我学习FreeRTOS队列创建的知识。主要分享队列创建需要使用的初始化函数、队列复位函数。 需要进一步了解FreeRTOS队列的相关知识,读者可以参考以下文章: FreeRTOS学习——FreeRTOS队列(上)_freertos 单元素队列-CSDN博…

scikit-learn机器学习要点总结

目录 一、机器学习总体流程二、引入数据集三、将数据集转换为DataFrame四、可视化数据五、数据预处理(一)数据标准化(二)独热编码 六、数据集划分为训练集和测试集七、创建模型估计器(estimator)(一)用于回…

人力资源(HR)OKR 案例

HR人员 #OKR# 是一个很好的方法来建立一致性,吸引团队成员,并实现高绩效。 在本文中,我们将回答以下问题: 如何写好HR OKR ? 什么是好的HR OKR 的例子 ? 我应该在我的HR OKR 中填写什么 ? 如何…

stream( ).collect ( Collectors.groupingBy ( ) ) 的用法

文章目录 第一种解释1、基本用法2、指定值收集器3、多级分组4、常见应用场景和用处 第二种解释1、基本语法2、示例3、更复杂的用法 第一种解释 Collectors.groupingBy 是 Java 8 引入的 Stream API 中的一个收集器(Collector),它用于将流&am…

【NumPy】关于numpy.transpose()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

16.js数学方法和进制转换

数学方法 (1)Math.random() 默认生成0-1的随机数 var resMath.random() console.log(res) (2)Math.round(数字) 取整:正数-四舍五入 负数-5舍6入 var resMath.round(11)console.log(res) //11var res1Math.round(1…

2024-5-6-从0到1手写配置中心Config之实现配置中心客户端

配置加载原理 在Spring中PropertySource类实现了所有属性的实例化。 启动赋值: 定义自定义属性配置源,从config-server获取全局属性;Spring启动时,插入自定义属性配置源;绑定属性会优先使用,给自定义属性…

下拉框操作/键鼠操作/文件上传

在我们做UI自动化测试的时候,会有一些元素需要特殊操作,比如下拉框操作/键鼠操作/文件上传。 下拉框操作 在我们很多页面里有下拉框的选择,这种元素怎么定位呢?下拉框分为两种类型:我们分别针对这两种元素进行定位和…