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

在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,// 只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0String[] 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.mzph.cn/web/14199.shtml

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

相关文章

c++ 排序算法merge使用要求

在C中&#xff0c;std::merge是一个算法&#xff0c;它用于合并两个已排序的范围&#xff08;例如数组或容器中的一部分&#xff09;到一个新的范围中。这个函数在<algorithm>头文件中定义。 输入范围必须已排序 std::merge要求输入的两个范围都必须是已排序的&#xf…

23种设计模式顺口溜

口诀&#xff1a; 原型 抽风 &#xff0c;单独 建造 工厂 &#xff08;寓意&#xff1a;&#xff08;这里代指本来很简单的东西&#xff0c;却要干工厂这里复杂的业务&#xff09; 抽风&#xff1a;抽象工厂单独&#xff1a;单例桥代理组合享元适配器&#xff0c;&#xff0…

Microsoft VBA Excel 去重小工具

问题简述 在本工作表中&#xff0c;A1:B3单元格样式如下&#xff0c;通过名称管理器B列的单元格被命名为"LinkFile"、“SheetName”、“InputArea”&#xff0c;请实现以下功能&#xff1a;读取Excel文件中的数据&#xff0c;去除重复的数据&#xff0c;并记录每个数…

亚马逊云科技介绍

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、亚马逊云科技云计算1.1 云计算的优势 二、领先的云平台三、亚马逊云科技区域的全球网络…

最简单的,在mac笔记本上安装Unix-v6系统,进行“Unix内核源码剖析”

Unix V6 已经是 1975 年的系统了&#xff0c;但是其源代码拢共只有 1w 行左右&#xff0c;并且使用了 C 语言&#xff08;K & R 之前的标准&#xff09;&#xff0c;还是现代操作系统的鼻祖&#xff0c;所以说是初学者最好的研究对象。 安装模拟器 brew install simh …

【MySQL精通之路】SQL优化(1)-查询优化(3)-索引合并

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客 下一篇&#xff1a; 目录 1.索引合并-交集访问算法 2.索引合并联合访问算法 3.索引合并-排序联合访问算法 4.影响索引合…

平衡发展与环保:理性看待地下式污水处理厂建设|中联环保圈

这些年啊&#xff0c;随着城市化进程越来越快&#xff0c;还有环境保护意识不断提高&#xff0c;这地下式污水处理厂慢慢就成了热门的建设趋势了。据相关统计&#xff0c;全球现在运行着 200 多座地下式污水处理厂呢&#xff0c;咱国家建成和在建的数量也差不多快到 200 座啦。…

基于transformers框架实践Bert系列4-文本相似度

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

STM32入门笔记(02):USART串口通信注意事项笔记(SPL库函数版)

这是通过串口通信发送过来的数据&#xff0c;里面包括了故障码&#xff0c;电压&#xff0c;电流&#xff0c;频率等信息&#xff0c;请你用STM32f103系列单片机的串口1读取该数据并解析出电压和电流是多少&#xff1f; 要用STM32F103系列单片机的串口1读取并解析发电机上的逆…

【Django项目】 音乐网站spotify复刻

代码&#xff1a;https://github.com/tomitokko/spotify-clone 注&#xff1a;该项目不是自己提供mp3文件&#xff0c;而是使用spotify 的api接口获取。

docker 命令总结

导出镜像下载 centos 镜像 docker pull centos:centos7.7.1908 常用命令 docker ps 查看正在运行的容器 docker ps -a 查看所有容器 docker images 查看本地已有镜像 停止所有容器 docker stop $(docker ps -aq) 停止某个容器 docker stop 容器名称 删除所有容器 dock…

Java基础入门day54

day54 servlet升级03 特点 当前设计又有一个问题&#xff0c;我们目前可以做到一个实体类用一个servlet&#xff0c;比如Student类的所有crud方法都可以在StudentServlet中的service方法中进行动态处理。假如又有User类&#xff0c;我们就要在UserServlet中设计service方法&a…

探索文档识别技术在加强教育资源共享与合作中的潜力

在数字化浪潮不断推进的今天&#xff0c;教育资源的共享与合作已经成为提高教学质量和效率的关键因素。文档识别技术作为一项强大的工具&#xff0c;在这一过程中发挥着至关重要的作用。本文旨在探讨如何通过文档识别技术的应用&#xff0c;促进教育资源的有效共享与教师、学校…

MySQL主从复制故障:“ Slave_SQL_Running:No“ 两种解决办法

问题 今天搭建MySQL的主从复制&#xff0c;查看从机状态时show slave status\G&#xff0c;发现这个参数为NO&#xff0c;导致主从复制失败。 Slave_SQL_Running: No 后面上网查阅了一下资料&#xff0c;大概就是因为在连接支持数据库后&#xff0c;也就是这个命令后&#xff…

Adobe产品安装目录修改

进入安装包目录&#xff0c;进入到products文件夹 编辑driver.xml文件 将“InstallDir”修改为你需要安装的软件的目录&#xff0c;我这里是修改到D:\Adobe目录 <DriverInfo> <ProductInfo> xxxxxxxxxxxxxxxxx </ProductInfo> 拷贝RequestInfo这部分…

c-lodop 打印面单 内容串页

场景&#xff1a;使用c-lodop程序调取打印机连续打印多张快递单时&#xff0c;上页内容&#xff0c;打到了下一页了 问题原因&#xff1a; 由于是将所有面单内容放到了一个页面&#xff0c;c-lodop 在打印时&#xff0c;发现一页放不下&#xff0c;会自动分割成多页 页面元素…

【在Postman中,如果后端返回的是String类型的数据但不是JSON格式,报错】

在Postman中&#xff0c;如果后端返回的是String类型的数据但不是JSON格式 问题描述解决办法 postman后端返回的String数据,不是json,怎么设置结果的接收&#xff1f; 问题描述 在postman中测试接口&#xff0c;报错Error&#xff1a;Abort&#xff0c;或者显示返回数据校验失…

coveralls使用pytest进行本地测试时报错SyntaxError: invalid escape sequence \S

## 错误复现&#xff1a; git clone gitgithub.com:TheKevJames/coveralls-python.git cd coveralls-python poetry install poetry run pytest## 错误内容&#xff1a; ## 完整的打印信息 test session starts platform darwin -- Python 3.8.18, pytest-8.2.1, pluggy-1.5.…