最近在做毕业设计,日志管理涉及到记录用户的ip和位置,就在github上找到了ip2region这个开源项目,照着官方文档做本来很简单的一个集成,但有个巨坑耽搁了我一下午时间,遂写这篇文章记录一下
- 首先咋们引入ip2region的依赖
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>2.6.6</version>
</dependency>
- 然后去github上下载所需要的xdb文件
github链接: 下载地址
gitee链接: 下载地址 - 在
src/main/resources
目录下新建一个目录ip2region
,把刚下载好的ip2region.xdb
拷贝进去 - 然后就开始写通过IP获取地理位置的工具类
AddressUtils
@Slf4j
public class AddressUtils {
private static final String IP2REGION_TEMP_DIR = "/home/upload/";
@SneakyThrows
public static String getRealAddressByIP(String ip) {
if (IpUtils.internalIp(ip)) {
return "内网IP";
}
String dbPath = Objects.requireNonNull(AddressUtils.class.getResource("/ip2region/ip2region.xdb")).getPath();
File file = new File(dbPath);
if (! file.exists()) {
dbPath = IP2REGION_TEMP_DIR + "ip2region.xdb";
file = new File(dbPath);
FileUtils.copyInputStreamToFile(Objects.requireNonNull(AddressUtils.class.getClassLoader().getResourceAsStream("classpath:ip2region/ip2region.xdb")), file);
}
Searcher searcher = Searcher.newWithFileOnly(dbPath);
String result = searcher.search(ip);
if (StrUtil.isEmpty(result)) {
log.error("获取地理位置异常 {}", ip);
return "XX-XX-XX";
}
String[] obj = result.split("\\|");
searcher.close();
return String.format("%s-%s-%s", obj[0], obj[2], obj[3]);
}
}
- 很简单的一个集成,我以为就结束了,但万万没想到,在本地跑好好的,在服务器通过jenkins构建后,返回的结果一直是
null
,然后就开始漫长的排查,但这玩意儿还真不好排查,本地debug走了几遍都没问题,最后都准备放弃使用这个,寻找其他的方式来获取IP位置了,然后发现了mica-ip2region
这款,官方文档第一页就写着maven resources 拷贝文件是默认会做 filter,会导致我们的文件发生变化,导致不能读,pom 中你需要添加下面的配置
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>db</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
- 这个坑我是踩扎实了,一下午时间就浪费过去了
- 最后附上一下午的提交记录