package cc.mrbird.febs.common.utils;
|
|
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 java.io.File;
|
import java.io.IOException;
|
import java.lang.reflect.Method;
|
|
/**
|
* @author MrBird
|
*/
|
@Slf4j
|
public class AddressUtil {
|
|
@SuppressWarnings("all")
|
public static String getCityInfo(String ip) {
|
DbSearcher searcher = null;
|
try {
|
String dbPath = AddressUtil.class.getResource("/ip2region/ip2region.db").getPath();
|
File file = new File(dbPath);
|
if (!file.exists()) {
|
String tmpDir = System.getProperties().getProperty("java.io.tmpdir");
|
dbPath = tmpDir + "ip.db";
|
file = new File(dbPath);
|
FileUtils.copyInputStreamToFile(AddressUtil.class.getClassLoader().getResourceAsStream("classpath:ip2region/ip2region.db"), file);
|
}
|
int algorithm = DbSearcher.BTREE_ALGORITHM;
|
DbConfig config = new DbConfig();
|
searcher = new DbSearcher(config, dbPath);
|
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;
|
}
|
DataBlock dataBlock = null;
|
if (!Util.isIpAddress(ip)) {
|
log.error("Error: Invalid ip address");
|
}
|
dataBlock = (DataBlock) method.invoke(searcher, ip);
|
return dataBlock.getRegion();
|
} catch (Exception e) {
|
log.error("获取IP地址失败,{}", e.getMessage());
|
} finally {
|
if (searcher != null) {
|
try {
|
searcher.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
return null;
|
}
|
|
}
|