Java通过Ip2region实现IP定位

news2024/11/25 6:30:03

我们在一些短视频平台上可以看到,视频作者或评论区可以显示IP地址,这其实就是根据IP获取到的我们可以通过一些在线网站就可以看到我们当前的公网IP和IP定位,最近有个需求也需要通过请求获取客户端的IP和IP的定位,于是通过一系列的百度,最终选择使用Ip2region这个工具库来进行定位

 Ip2region简介

Ip2region是一个开源工具库,是一种用于IP地址定位的工具。 它是基于B树数据结构的数据库,可用于将IP地址转换为国家、省、市、区县等信息。 使用Ip2region工具,您可以轻松地查找某个IP地址所在的区域信息,从而帮助您进行定位和分析。

目前Ip2region有1.0和2.0两个版本,p2region 1.0和Ip2region 2.0之间的主要区别在于数据的更新频率和精度。 Ip2region 2.0在原有版本的基础上增加了更多的数据,例如更详细的地图信息和更准确的IP地址定位。 Ip2region 2.0的数据更新频率也更高,这意味着它将提供更精确的信息。此外, Ip2region 2.0还提供了Java、Python和PHP等语言的版本,这使得它更加适用于不同类型的应用程序。

GitHub地址(CSDN镜像地址,非原地址):https://gitcode.net/mirrors/lionsoul2014/ip2region

 Ip2region使用

前面提到Ip2region分为1.0和2.0两个版本,此处我是用的是2.0版本,如需1.0版本此文章并不适用,可以参考如下文章

(153条消息) Java根据ip地址获取归属地_java通过ip地址获取地区_java技术媛的博客-CSDN博客

 Ip2region2.0版本引入依赖

2.7.0是当前最新版本,使用Ip2region2.0引入2.6.0版本及以上应该是都可以的

<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>2.7.0</version>
</dependency>

下载ip2region.xdb文件

下载链接;https://gitcode.net/mirrors/lionsoul2014/ip2region/-/blob/master/data/ip2region.xdb

 如果链接失效:进入上文github地址然后选在data文件夹,里面就有ip2region.xdb文件

 下载后将其放在resources文件夹下,注意在pom文件里添加排除配置,防止maven将文件编译

<plugin>
    <configuration>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>xdb</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
</plugin>

Searcher介绍

ip2region核心类就是Searcher,在2.0的版本中它有三种创建方式,三种方式使用方式不太一样,接下来逐一介绍

newWithFileOnly(String dbPath)

此种创建方式,只有一个参数,顾名思义,我们可以知道入参其实就是ip2region.xdb文件的路径,此种创建方式是最基础的创建方式,不支持并发,每次创建都需要进行一次IO,读取本地ip2region.xdb文件

newWithVectorIndex(String dbPath, byte[] vectorIndex)

此种创建方式多出来一个vectorIndex参数,它是一个字节数组我们可以提前从 xdb 文件中加载出来 VectorIndex 数据,然后全局缓存,每次创建 Searcher 对象的时候使用全局的 VectorIndex 缓存可以减少一次固定的 IO 操作,从而加速查询,减少 IO 压力。此种方式也不支持并发,每个线程需要重新new一个Searcher对象

newWithBuffer(byte[] cBuff)

此种创建方式只有一个cBuff参数,它可以预先加载整个 ip2region.xdb 的数据到内存,然后基于这个数据创建查询对象来实现完全基于文件的查询无IO压力,而且仅占用11M内存,最重要的是它支持并发,全局只需要创建一次即可,也是查询效率最高的一种方法,下面我自己封装了一个工具类,就是采用的这种方式

工具类代码

/**
 * ip解析工具
 *
 * @author zzt
 * @version v1.0.0
 * @date 2023/6/9 9:26
 */
@Slf4j
public class IpParseUtil {

    /**
     * 将整个xdb文件加载到内存中(11M左右),此种创建方式支持多线程,因此只需要加载一次
     */
    private final static Searcher SEARCHER;

    static {
        try {
            ClassPathResource resource = new ClassPathResource("ip2region.xdb");
            //获取真实文件路径
            String path = resource.getURL().getPath();
            byte[] cBuff = Searcher.loadContentFromFile(path);
            SEARCHER = Searcher.newWithBuffer(cBuff);
            log.info("加载了ip2region.xdb文件,Searcher初始化完成!");
        } catch (Exception e) {
            log.error("初始化ip2region.xdb文件失败,报错信息:[{}]", e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
    }


    /**
     * 解析ip地址
     *
     * @param ipStr 字符串类型ip 例:192.168.0.1
     * @return 返回结果形式(国家|区域|省份|城市|ISP) 例 [中国, 0, 河北省, 衡水市, 电信]
     */
    public static List<String> parse(@NotBlank String ipStr) {
        return parse(ipStr, null);
    }

    /**
     * 自定义解析ip地址
     *
     * @param ipStr ip 字符串类型ip 例:1970753539(经过转换后的)
     * @param index 想要获取的区间 例如:只想获取 省,市 index = [2,3]
     * @return 返回结果例 [北京,北京市]
     */
    public static List<String> parse(@NotBlank String ipStr, int[] index) {
        try {
            long ip = Searcher.checkIP(ipStr);
            return parse(ip, index);
        } catch (Exception e) {
            log.error("ip解析为long错误,ipStr:[{}],错误信息:[{}]", ipStr, e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
    }

    /**
     * 自定义解析ip地址
     *
     * @param ip    ip Long类型ip 例:192.168.0.1
     * @param index 想要获取的区间 例如:只想获取 省,市 index = [2,3]
     * @return 返回结果例 [河北省, 衡水市]
     */
    public static List<String> parse(@NotNull Long ip, int[] index) {
        //获取xdb文件资源
        List<String> regionList = new ArrayList<>();
        try {
            String region = SEARCHER.search(ip);
            String[] split = region.split("\\|");
            if (index == null) {
                regionList = Arrays.asList(split);
            } else {
                for (int i : index) {
                    regionList.add(split[i]);
                }
            }
            //关闭资源
            SEARCHER.close();
        } catch (Exception e) {
            log.error("根据ip解析地址失败,ip:[{}],index[{}],报错信息:[{}]", ip, index, e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
        return regionList;
    }
}

简单测试 

public class IPTest {
    public static void main(String[] args) {
        //只获取省,市
        int[] index = {2, 3};
        List<String> parse = IpParseUtil.parse("222.223.145.133", index);
        System.out.println(parse);
    }
}

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

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

相关文章

flutter的自定义系列雷达图

自定义是flutter进阶中不可缺少的ui层知识点&#xff0c;这里我们来总结下&#xff1a; 在Flutter中&#xff0c;自定义绘制通常是通过使用CustomPaint和CustomPainter来实现的。 创建CustomPaint组件 首先&#xff0c;需要创建一个CustomPaint组件。CustomPaint是一个Widge…

MobPush 厂商通道申请指南

华为厂商申请 创建应用 登录华为开发者联盟&#xff0c;注册您的应用&#xff0c;在应用信息中获取APP ID和Client Secret 配置SHA256证书指纹 在华为开发者联盟配置SHA256证书指纹。获取及配置请参见华为官方文档配置AppGallery Connect 设置消息回执 集成华为厂商通道SDK…

带你了解二进制

目录 视频参考&#xff1a; 讲解&#xff1a;​编辑 运算&#xff1a; 1001&#xff08;二进制&#xff09; 9&#xff08;十位数&#xff09;1111&#xff08;二进制&#xff09; 15&#xff08;十位数&#xff09;11001&#xff08;二进制&#xff09; 25&#xff08;…

第二章 搭建TS环境

搭建 TypeScript 的开发环境。一个舒适、便捷且顺手的开发环境&#xff0c;不仅能大大提高学习效率&#xff0c;也会对我们日常的开发工作有很大帮助。 这一节我们就来介绍 VS Code 下的 TypeScript 环境搭建&#xff1a;插件以及配置项。对于 TS 文件的执行&#xff0c;我们会…

设计模式(十):结构型之外观模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

备战2月面试8家大厂,成功上岸字节(Java岗)定级T2-2,分享一下我的面试心得

最近在公众号上看到一位道友的字节面经&#xff0c;可以说是深有感触了&#xff01; 他的背景是杭州某中厂的Java后端开发&#xff0c;本科毕业5年&#xff0c;最近2个月面试了PDD、小红书、字节等多个大厂。几乎都拿到了Offer&#xff0c;最终选择了字节2-2。以下是他的一些分…

Navicat对postgresql导入导出的坑

Navicat导出postgresql中的表&#xff0c;再新建数据库导入时通常会报错&#xff0c;往往是因为自增id导致的 可以看到&#xff0c;再次导入时会报错&#xff01; 解决办法如下&#xff1a; 解决办法&#xff1a; 重新导入&#xff0c;并执行以下命令&#xff1a;&#xff08…

Python从入门到精通_第0讲_Python的学习路线整理

写在最前&#xff1a; 为什么开这个专栏&#xff1a; 之前我做过一个专栏&#xff0c;专门介绍Python爬虫技术&#xff0c;这一专栏收获了很多朋友们的点赞收藏和关注。但是在爬虫技术专栏中&#xff0c;对于Python语言本身的讲解并不是很细致&#xff0c;由于Python在爬虫、数…

Unity 安装 wwise

先下载 https://www.audiokinetic.com/zh/download 安装的时候要选sdk 就是20g的那个 然后运行 选择unity 可以看到这个界面 好&#xff0c;现在开始要安装离线包 直接项目里点 第二个 装好后 他会提示你 无法找到unity安装的地址 1 打开你的 unity 编辑器 2 在unity安装的…

CorelDRAW矢量绘图2023中文版下载

市面上的矢量绘图工具虽然很多&#xff0c;但权威又专业的却不多&#xff0c;选到不好用的工具&#xff0c;会极大的影响自己创作&#xff0c;CorelDRAW简称cdr&#xff0c;是一款功能强大的矢量图制作软件&#xff0c;一说到矢量图制作&#xff0c;大家都会不由自主地想到cdr。…

车牌识别之UI(Tkinter + OpenCV显示Picture和Video)

画一张总图&#xff1a; 图形界面开发 本篇只介绍图形界面开发。 遇到的第一个问题就是选择什么开发语言和技术。因为我之前用Python做过Tkinter的小东西&#xff0c;所以这次还是用Python Tkinter OpenCV来搞吧。 这里面需要注意几个地方&#xff1a; 1. Tkinter 的布局 …

ADManager Plus:提升企业人员管理效率的全能工具

导言&#xff1a; 在现代企业中&#xff0c;高效的人员管理是取得成功的关键。随着企业规模的扩大和人员数量的增加&#xff0c;传统的人工管理方法已经无法满足快速变化的需求。ADManager Plus作为一款全能的人员管理工具&#xff0c;通过自动化和集成的方式&#xff0c;为企…

一文即可了解!自动化回归测试工具

目录 前言&#xff1a; 设计背景&#xff1a; 解决方案&#xff1a; 测试工具使用loadrunner脚本编写&#xff0c;这样的好处是 控制指令说明&#xff1a; 自定义检查方法说明&#xff1a; 变量说明&#xff1a; 附加动作说明&#xff1a; 前言&#xff1a; 自动化回归测试工…

Numpy---ndarray矩阵运算、广播机制、排序、文件操作

1. 矩阵运算 n 10 # 加 n - 10 # 减 n * 10 # 乘 n / 10 # 除 n // 2 # 整除 n ** 2 # 次方 n % 2 # 余数 n1 np.random.randint(0, 10, size(4, 5)) n2 np.random.randint(0, 10, size(4, 5)) display(n1, n2) array([[3, 6, 1, 9, 9],[8, 9, 2, 0, 4],[4, 8, 5, …

17 条件随机场

文章目录 17 条件随机场——CRF&#xff08;Condition Random Field&#xff09;17.1 背景介绍17.2 HMM与MEMM的区别17.3 MEMM与CRF的区别17.4 CRF模型17.4.1 CRF的概率密度函数17.4.2 CRF概率密度函数简化&#xff08;向量形式&#xff09; 17.5 CRF需要解决的问题17.6 边缘概…

基于 AIGC,RocketMQ 学习社区探索开源软件学习新范式

作者&#xff1a;寒斜 AIGC 持续火爆全球&#xff0c;越来越多的场景开始接入并体现非凡的价值。其中应用广泛的场景之一就是智能知识问答&#xff0c;它改变了人们学习的方式&#xff0c;从阅读式到问答式&#xff0c;让知识的获取更加精准有效。开源软件拥有着广泛的求知群体…

ITSM 如何帮助制造业企业

ITSM在现代制造业中的作用 在过去的几年中&#xff0c;制造业已经看到了快速的数字化&#xff0c;以智能制造技术改进生产技术。在工业4.0和工业5.0的推动下&#xff0c;制造商正在摆脱陈旧 以及利用物联网、人工智能、机器学习和大数据等先进技术的互联智能制造系统&#xff…

【Protobuf速成指南】Any类型的使用

文章目录 2.2 Any类型的使用一、基本认识二、使用需知三、Any字段的使用①修改proto文件② Any相关函数③ 类型转换 四、Contact 2.2 改写 2.2 Any类型的使用 本系列文章将通过对通讯录项目的不断完善&#xff0c;带大家由浅入深的学习Protobuf的使用。这是Contacts的2.2版本&a…

基于脑电功率的疲劳驾驶检测研究_kaic

基于脑电功率的疲劳驾驶检测研究 摘 要 在道路交通安全领域&#xff0c;疲劳驾驶是一种常见的交通安全隐患。现有数据统计&#xff0c;全球每年有大约&#xff12;&#xff11;&#xff05;的重大交通事故与疲劳驾驶有关&#xff0c;疲劳驾驶成为了诱发交通事故的主要原因之一…

多模态深度学习:定义、示例、应用

人类使用五种感官来体验和解读周围的世界。我们的五种感官从五个不同的来源和五种不同的方式捕捉信息。模态是指某事发生、经历或捕捉的方式。 人脑由可以同时处理多种模式的神经网络组成。想象一下进行对话——您大脑的神经网络处理多模式输入&#xff08;音频、视觉、文本、…