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);}
}
调试如下结果如下: