ip2region(1):java通过Ip2region实现IP定位

news/2024/11/20 9:21:23/

1 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等语言的版本,这使得它更加适用于不同类型的应用程序。

Ip2region地址如下:

mirrors / lionsoul2014 / ip2region · GitCode

2 Ip2region使用

2.1 新建一个maven项目

添加引入依赖如下:

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

2.2 下载ip2region.xdb文件

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

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

2.3 编写工具类

package com.example.demo.Utils;import lombok.extern.slf4j.Slf4j;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.core.io.ClassPathResource;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;@Slf4j
public class IpParseUtil {/*** 将整个xdb文件加载到内存中(11M左右),此种创建方式支持多线程,因此只需要加载一次*/private final static Searcher SEARCHER;static {try {ClassPathResource resource = new ClassPathResource("iptoregiondb/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;}
}

2.4 测试类

package com.example.demo;import com.example.demo.Utils.IpParseUtil;import java.util.List;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.ppmy.cn/news/1044195.html

相关文章

Shell编程学习之if分支语句的应用

Shell编程中的if分支语句&#xff1a;伪代码表示&#xff1a;注意符号和表达式之间的空格&#xff1b; if [ 表达式1 ] then分支1 elif [ 表达式2 ] then分支2 elif [ 表达式3 ] then分支3 else其它 fi按整型的方式&#xff0c;if分支语句比较字符串的大小&#xff1a;等于&am…

jdk 1.8新特性 01内部类和lambda

01.内部类&#xff1a; 1、成员内部类 内部类与成员外部类的关系 a.成员内部类的创建需要依赖于外部类对象-&#xff08;成员方法必须通过对象调用&#xff09;&#xff0c;在没有外部类实例之前无法创建成员内部类对象 b.内部类与外部类相对独立&#xff0c;不是is a 的关系…

0基础学习VR全景平台篇 第87篇:智慧眼-公告有什么作用?

一、功能说明 公告&#xff0c;即政府、团体对有关事件或者行动发布的通告。公告内容由管理员在后台添加&#xff0c;智慧眼成员在场景中添加热点时可以选择引用此公告&#xff0c;引用后会在热点详情页中展示。 二、后台编辑界面 点击【新增】&#xff0c;填写公告的标题和…

VS 运行编译通过,但代码下方 标红波浪线 问题

解决办法一&#xff1a;重新扫描 一次 解决方案&#xff0c; 就会去掉红线 方法2&#xff1a; VS 运行编译通过&#xff0c;但代码标红波浪问题解决办法_vs代码下面有波浪线_Start_Or_Out的博客-CSDN博客

IDEA:Error running,Command line is too long. 解决方法

报错如下&#xff1a; Error running SendSmsUtil. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun.原因是启动命令过长。 解决方法&#xff1a; 1、打开Edit Configurations 2、点击Modify options设置&#x…

OpenFOAM:集成AMGX方程求解器实践

OpenFOAM: 集成AMGX方程求解器实践 介绍 OpenFOAM是流体计算中最著名的开源库&#xff0c;历史悠久&#xff0c;功能丰富&#xff0c;同时源码规模也非常庞大。在模型问题求解中&#xff0c;最终映射到稀疏矩阵(ldumatrix)方程求解问题&#xff0c;OpenFOAM自带数个方程求解器…

git报错Add correct host key

想克隆备份的笔记库&#xff0c;失败。 测试连接github报错如下。 $ ssh -T gitgithub.comWARNING: POSSIBLE DNS SPOOFING DETECTED! The RSA host key for github.com has changed, and the key for the corresponding IP address 140.82.121.4 is unknown. This c…

机器人TF坐标系变换与一些可视化工具的应用

TF坐标在ROS中是一个非常重要的概念&#xff0c;因为机器人在做日常操作任务的时候&#xff0c;对于其所在位置和朝向是需要时刻知道的&#xff0c;而机器人是由很多节点组成的协同任务&#xff0c;对于每个部件&#xff0c;我们需要知道它的位姿(位置和朝向)&#xff0c;这使得…