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