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; } }