- 对所有 Java 源文件应用统一的代码格式化 - 统一缩进为 4 个空格 - 清理尾随空白字符和文件末尾换行 - 优化导入语句组织 - 总计格式化 654 个 Java 文件 有问题可以回滚或者找我聊
106 lines
3.4 KiB
Java
106 lines
3.4 KiB
Java
package com.starry.common.utils;
|
|
|
|
/**
|
|
* @author admin
|
|
* @since 2024/7/25 下午3:15
|
|
**/
|
|
|
|
import java.io.File;
|
|
import java.io.InputStream;
|
|
import java.lang.reflect.Method;
|
|
import java.util.Objects;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.io.FileUtils;
|
|
import org.lionsoul.ip2region.DataBlock;
|
|
import org.lionsoul.ip2region.DbConfig;
|
|
import org.lionsoul.ip2region.DbSearcher;
|
|
import org.lionsoul.ip2region.Util;
|
|
import org.springframework.core.io.ClassPathResource;
|
|
|
|
/**
|
|
* 根据ip离线查询地址
|
|
*
|
|
* @author admin
|
|
*/
|
|
@Slf4j
|
|
public class RegionUtils {
|
|
|
|
private static final String JAVA_TEMP_DIR = "java.io.tmpdir";
|
|
|
|
static DbConfig config = null;
|
|
static DbSearcher searcher = null;
|
|
|
|
/**
|
|
* 初始化IP库
|
|
*/
|
|
static {
|
|
try {
|
|
// 因为jar无法读取文件,复制创建临时文件
|
|
String dbPath = Objects.requireNonNull(RegionUtils.class.getResource("/ip2region/ip2region.db")).getPath();
|
|
File file = new File(dbPath);
|
|
if (!file.exists()) {
|
|
String tmpDir = System.getProperties().getProperty(JAVA_TEMP_DIR);
|
|
dbPath = tmpDir + "ip2region.db";
|
|
file = new File(dbPath);
|
|
ClassPathResource cpr = new ClassPathResource("ip2region" + File.separator + "ip2region.db");
|
|
InputStream resourceAsStream = cpr.getInputStream();
|
|
FileUtils.copyInputStreamToFile(resourceAsStream, file);
|
|
}
|
|
config = new DbConfig();
|
|
searcher = new DbSearcher(config, dbPath);
|
|
log.info("bean [{}]", config);
|
|
log.info("bean [{}]", searcher);
|
|
} catch (Exception e) {
|
|
log.error("init ip region error:", e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 解析IP
|
|
*
|
|
* @param ip
|
|
* @return
|
|
*/
|
|
public static String getRegion(String ip) {
|
|
try {
|
|
// db
|
|
if (searcher == null || StringUtils.isEmpty(ip)) {
|
|
log.error("DbSearcher is null");
|
|
return StringUtils.EMPTY;
|
|
}
|
|
long startTime = System.currentTimeMillis();
|
|
// 查询算法
|
|
int algorithm = DbSearcher.MEMORY_ALGORITYM;
|
|
Method method = null;
|
|
switch (algorithm) {
|
|
case DbSearcher.BTREE_ALGORITHM :
|
|
method = searcher.getClass().getMethod("btreeSearch", String.class);
|
|
break;
|
|
case DbSearcher.BINARY_ALGORITHM :
|
|
method = searcher.getClass().getMethod("binarySearch", String.class);
|
|
break;
|
|
case DbSearcher.MEMORY_ALGORITYM :
|
|
method = searcher.getClass().getMethod("memorySearch", String.class);
|
|
break;
|
|
default :
|
|
return StringUtils.EMPTY;
|
|
}
|
|
|
|
DataBlock dataBlock = null;
|
|
if (!Util.isIpAddress(ip)) {
|
|
log.warn("warning: Invalid ip address");
|
|
}
|
|
dataBlock = (DataBlock) method.invoke(searcher, ip);
|
|
String result = dataBlock.getRegion();
|
|
long endTime = System.currentTimeMillis();
|
|
log.debug("region use time[{}] result[{}]", endTime - startTime, result);
|
|
return result;
|
|
|
|
} catch (Exception e) {
|
|
log.error("error:", e);
|
|
}
|
|
return StringUtils.EMPTY;
|
|
}
|
|
|
|
}
|