diff --git a/pom.xml b/pom.xml index 6c87937..db65812 100644 --- a/pom.xml +++ b/pom.xml @@ -175,6 +175,12 @@ + + org.lionsoul + ip2region + 1.7.2 + + diff --git a/src/main/java/cn/celess/blog/util/AddressUtil.java b/src/main/java/cn/celess/blog/util/AddressUtil.java new file mode 100644 index 0000000..2168e8c --- /dev/null +++ b/src/main/java/cn/celess/blog/util/AddressUtil.java @@ -0,0 +1,71 @@ +package cn.celess.blog.util; + +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.lang.reflect.Method; +import java.util.Objects; + +/** + * @author : xiaohai + * @date : 2020/09/04 9:36 + */ + +@Slf4j +public class AddressUtil { + + public static String getCityInfo(String ip) { + File file; + try { + //db + String dbPath = AddressUtil.class.getResource("/ip2region/ip2region.db").getPath(); + 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(Objects.requireNonNull(AddressUtil.class.getClassLoader().getResourceAsStream("classpath:ip2region/ip2region.db")), file); + } + //查询算法 + //B-tree + int algorithm = DbSearcher.BTREE_ALGORITHM; + try { + DbConfig config = new DbConfig(); + DbSearcher 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; + if (!Util.isIpAddress(ip)) { + System.out.println("Error: Invalid ip address"); + } + + dataBlock = (DataBlock) method.invoke(searcher, ip); + + return dataBlock.getRegion(); + + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } +} diff --git a/src/main/resources/ip2region/ip2region.db b/src/main/resources/ip2region/ip2region.db new file mode 100644 index 0000000..d41b4a0 Binary files /dev/null and b/src/main/resources/ip2region/ip2region.db differ diff --git a/src/test/java/cn/celess/blog/util/AddressUtilTest.java b/src/test/java/cn/celess/blog/util/AddressUtilTest.java new file mode 100644 index 0000000..5c01440 --- /dev/null +++ b/src/test/java/cn/celess/blog/util/AddressUtilTest.java @@ -0,0 +1,15 @@ +package cn.celess.blog.util; + +import cn.celess.blog.BaseTest; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class AddressUtilTest extends BaseTest { + + @Test + public void getCityInfo() { + assertEquals("0|0|0|内网IP|内网IP", AddressUtil.getCityInfo("127.0.0.1")); + assertEquals("中国|0|上海|上海市|阿里云", AddressUtil.getCityInfo("106.15.205.190")); + } +} \ No newline at end of file