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