离线定位fix

This commit is contained in:
admin
2024-07-25 15:52:01 +08:00
parent e775faa738
commit 9ae9963ea4
7 changed files with 154 additions and 20 deletions

View File

@@ -104,6 +104,12 @@
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>

View File

@@ -0,0 +1,106 @@
package com.starry.common.utils;
/**
* @author admin
* @since 2024/7/25 下午3:15
**/
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;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Objects;
/**
* 根据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;
}
}

View File

@@ -1,9 +1,7 @@
package com.starry.common.utils.ip;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.starry.common.utils.HttpUtils;
import com.starry.common.utils.RegionUtils;
import com.starry.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
@@ -27,21 +25,20 @@ public class AddressUtils {
public static String getRealAddressByIp(String ip) {
if ("127.0.0.1".equals(ip)) {
return "内网IP";
} else {
try {
String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", "GBK");
if (StringUtils.isEmpty(rspStr)) {
log.error("获取地理位置异常 {}", ip);
return UNKNOWN;
}
JSONObject obj = JSON.parseObject(rspStr);
String region = obj.getString("pro");
String city = obj.getString("city");
return String.format("%s %s", region, city);
} catch (Exception e) {
log.error("获取地理位置异常 {}", ip);
}
return UNKNOWN;
}
try {
String rspStr = RegionUtils.getRegion(ip);
if (StringUtils.isEmpty(rspStr)) {
log.error("获取地理位置异常 {}", ip);
return UNKNOWN;
}
String[] obj = rspStr.split("\\|");
String region = obj[2];
String city = obj[3];
return String.format("%s %s", region, city);
} catch (Exception e) {
log.error("获取地理位置异常", e);
}
return UNKNOWN;
}
}