Java通过Ip2region实现IP定位

article/2025/10/25 6:53:55

我们在一些短视频平台上可以看到,视频作者或评论区可以显示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* @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://chatgpt.dhexx.cn/article/e8V87Bv0.shtml

相关文章

ip解析 java_JAVA解析纯真IP地址库

http://lumaqq.linuxsir.org/article/qqwry_format_detail.html&#xff0c;这里就不多叙述了。 看下JAVA代码中怎么解析IP的吧。(代码参考至lumaQQ.谢谢开源作者luma) 解析的主类 package com.showtime.IPparse; import java.io.File; import java.io.FileNotFoundException; …

Java后台获取IP地址位置信息

最近做一个项目&#xff0c;某个模块需要根据IP地址获取区域位置和运营商信息&#xff0c;以前都是根据淘宝提供的一个免费获取该信息接口 http://ip.taobao.com/service/getIpInfo.php?ip112.10.111.18 返回结果为 {"msg": "Server is busy ,Current qps 8…

java 根据ip获取地区信息

离线版本&#xff1a; 依赖&#xff1a; maven <dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>1.7</version> </dependency> gradle implementation org.lionsoul:ip2region:2…

Java根据IP地址获取对应归属地

1 前言 最近&#xff0c;各大平台都新增了评论区显示发言者ip归属地的功能&#xff0c;例如哔哩哔哩&#xff0c;微博&#xff0c;知乎等等&#xff0c;下面&#xff0c;就来讲讲&#xff0c;Java 中是如何获取 IP 属地的 2 获取IP地址 在Java中有多种获取IP地址的方式,就不…

L58.linux命令每日一练 -- 第九章 Linux进程管理命令 -- pgrep和kill

9.3 pgrep&#xff1a;查找匹配条件的进程 9.3.1 命令详解 ​ 【命令星级】 ★★★★☆ ​ 【功能说明】 ​ pgrep命令可以查找匹配条件的进程号。 ​ 【语法格式】 pgrep [option] [pattern] pgrep [选项] [匹配添加]​ **说明&#xff1a;**在pgrep命令及后面的选项和匹…

Linux命令之查找进程pgrep

概述 pgrep命令是通过名称从运行进程队列中查找进程&#xff0c;并且显示查找到的进程ID。 如果我们想要查找正常运行的java进程&#xff08;通常是tomcat进程&#xff09;&#xff0c;那么可以使用如下语句&#xff1a; ps -ef | grep java | grep -v grep | gawk -n {prin…

linuxpgrepgrep_Linux pgrep与kill的使用

想结束系统中指定的进程&#xff0c;有以下指令可能参考&#xff1a; ps -ef | grep pure-ftpd | grep -v grep | awk {print $2" "$3} | xargs kill -9 pkill pure-ftpd killall -9 nginx 或者 kill -9 ps aux |grep -i nginx |grep -v grep |awk {print $2} kill…

linux 命令 pgrep

linux查看服务pid pgrep是一个命令行实用程序&#xff0c;根据给定的条件查找正在运行的程序的进程id。它可以是完整的或部分的进程名、运行该进程的用户或其他属性。 语法&#xff1a; pgrep [options] pattern 当在没有任何选项的情况下调用时&#xff0c;pgrep将显示与给…

linux查看进程pgrep,查看进程PID专用工具-------pgrep

一、Linux命令pgrep简单介绍 pgrep是linux中常用的通过程序名称来查询进程的工具&#xff0c;一般是用来判断程序是否正在运行及查找正在运行进程的PID信息。通过pgrep命令&#xff0c;可以只指定进程的一部分名称从运行进程队列中进行查看进程的PID信息&#xff0c;但只输出PI…

linux shell pgrep命令使用方法(pgrep指令)获取进程号、统计进程数量(学会区分Linux进程进程名)

文章目录 问题背景pgrep指令help文档使用示例1. 列出匹配进程的PID和进程名称&#xff08;-l&#xff09;&#xff08;默认只能从进程名的子集字符串匹配&#xff0c;如果要使用完整进程名的子集字符串匹配&#xff0c;请加-f参数&#xff0c;下同&#xff09;2. 列出匹配进程的…

pgrep

Pgrep 用于根据进程的name查找进程的pid。例如&#xff1a;

Linux pgrep命令

1 pgrep pgrep是一个根据名称查找进程ID的命令&#xff0c;返回的是进程ID&#xff0c;若存在当个进程&#xff0c;则分为不同的行返回ID&#xff08;默认实现&#xff09;。 2 示例 查找java进程&#xff1a; pgrep java上图还显示了ps与pgrep的区别&#xff0c;简单来说&…

【笔记11】个人扫盲:内存与CPU中的核、线程、物理CPU、逻辑CPU

文章目录 CPU与内存CPU内存什么是通道常见问题 物理CPU和逻辑CPU常见问题LINUX查看WINDOW查看 CPU与内存 CPU CPU&#xff08;Central Processing Unit&#xff09;即中央处理器。CPU从内存&#xff08;Memory&#xff09;或缓存&#xff08;Cache&#xff09;中取出指令&…

Linux下区分物理CPU、逻辑CPU和CPU核数

一、概念 ① 物理CPU 实际Server中插槽上的CPU个数 物理cpu数量&#xff0c;可以数不重复的 physical id 有几个 ② 逻辑CPU Linux用户对 /proc/cpuinfo 这个文件肯定不陌生. 它是…

记录一个有意思的cpu逻辑cpu核数问题(已解决)

top命令查看逻辑cpu个数的时候发现只有20个 实际上服务器的的逻辑cpu个数是32个 物理cpu核数 PS&#xff1a;该问题也存在于部分新旧服务器上&#xff0c;网上没找到答案&#xff0c;特此记录。希望未来可以得到答案。 2021年09月27日更新 目前认为最近用到了多少cpu核数就显…

物理CPU,物理CPU内核,逻辑CPU概念详解

1.说明 CPU(Central Processing Unit)是中央处理单元&#xff0c; 本文介绍物理CPU&#xff0c;物理CPU内核&#xff0c;逻辑CPU&#xff0c; 以及他们三者之间的关系&#xff0c; 一个物理CPU可以有1个或者多个物理内核&#xff0c; 一个物理内核可以作为1个或者2个逻辑CPU。 …

Linux下区分物理CPU、逻辑CPU、CPU核数、线程数以及查看命令

概念 ① 物理CPU 实际服务器中插槽上的CPU个数 是指物理上&#xff0c;也就是硬件上存在着几颗物理cpu,指的是真实存在是cpu处理器的个数&#xff0c;1个代表一颗&#xff0c;2个代表2颗cpu处理器。 物理cpu数量&#xff0c;可以数不重复的 physical id 有几个 ② 逻辑CPU Lin…

linux服务器的物理CPU,CPU核数,逻辑CPU及Hadoop的Vcore

linux服务器的物理CPU&#xff0c;CPU核数&#xff0c;逻辑CPU及Hadoop的Vcore 1、Linux服务器的核数的概念 物理CPU&#xff1a; 服务器上真实存在的CPU&#xff0c;可以看到 CPU的核 (core)&#xff1a; 一个CPU上包含多少核(core)&#xff0c;真实存在但不能直接看到 总核数…

CPU 主频,核数 参数解读 物理CPU,逻辑CPU,物理核 概念辨析

Q1&#xff1a; CPU高主频好还是多核数好&#xff1f; 游戏需求 如果是主打游戏&#xff0c;由于游戏需要的是最简单粗暴的计算工作&#xff0c;这方面多核心有点无用武之地。因此&#xff0c;目前主流游戏都是双核心调用&#xff0c;四核或者更多核心的比较少。 也就是说&…

物理CPU-Core-逻辑CPU -超线程

原文地址&#xff1a; http://www.daniloaz.com/en/differences-between-physical-cpu-vs-logical-cpu-vs-core-vs-thread-vs-socket/ 水平所限&#xff0c;翻译不准确的地方望指正。 当我们使用像 nproc或者 lscpu等命令 来在CPU级别上获取计算机的架构和性能的时候&#xf…