diff --git a/pom.xml b/pom.xml
index e8a0050..90260be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -180,19 +180,16 @@
jaxb-api
2.3.0
-
com.sun.xml.bind
jaxb-impl
2.3.0
-
com.sun.xml.bind
jaxb-core
2.3.0
-
javax.activation
activation
@@ -200,6 +197,12 @@
+
+ org.lionsoul
+ ip2region
+ 1.7.2
+
+
diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/VisitorServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/VisitorServiceImpl.java
index b37d5ba..046805c 100644
--- a/src/main/java/cn/celess/blog/service/serviceimpl/VisitorServiceImpl.java
+++ b/src/main/java/cn/celess/blog/service/serviceimpl/VisitorServiceImpl.java
@@ -7,6 +7,7 @@ import cn.celess.blog.entity.model.VisitorModel;
import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.VisitorMapper;
import cn.celess.blog.service.VisitorService;
+import cn.celess.blog.util.AddressUtil;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.RedisUtil;
import com.github.pagehelper.PageHelper;
@@ -151,60 +152,7 @@ public class VisitorServiceImpl implements VisitorService {
* @return
*/
private String getLocation(String ip) {
- StringBuilder result = new StringBuilder();
- URL url;
- HttpURLConnection conn = null;
- InputStream inputStream = null;
- InputStreamReader inputStreamReader = null;
- BufferedReader bufferedReader = null;
- try {
- url = new URL("http://ip.taobao.com/service/getIpInfo.php?ip=" + ip);
- conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(3000);
- conn.setDoInput(true);
- conn.setRequestMethod("GET");
- inputStream = conn.getInputStream();
- inputStreamReader = new InputStreamReader(inputStream);
- bufferedReader = new BufferedReader(inputStreamReader);
- String tmp;
- while ((tmp = bufferedReader.readLine()) != null) {
- result.append(tmp);
- }
- } catch (Exception e) {
- // ignore
- } finally {
- try {
- if (conn != null) {
- conn.disconnect();
- }
- if (inputStream != null) {
- inputStream.close();
- }
- if (inputStreamReader != null) {
- inputStreamReader.close();
- }
- if (bufferedReader != null) {
- bufferedReader.close();
- }
- } catch (Exception e) {
- // ignore
- }
- }
- StringBuilder sb = new StringBuilder();
- if ("".equals(result.toString())) {
- throw new MyException(ResponseEnum.FAILURE);
- }
- Map stringObjectMap = JsonParserFactory.getJsonParser().parseMap(result.toString());
- if ((Integer) stringObjectMap.get("code") == 0) {
- LinkedHashMap data = (LinkedHashMap) stringObjectMap.get("data");
- sb.append(data.get("country"))
- .append("-")
- .append(data.get("region"))
- .append("-")
- .append(data.get("city"));
- }
- return sb.toString();
-
+ return AddressUtil.getCityInfo(ip);
}
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/service/serviceimpl/VisitorServiceImplTest.java b/src/test/java/cn/celess/blog/service/serviceimpl/VisitorServiceImplTest.java
new file mode 100644
index 0000000..ec99d85
--- /dev/null
+++ b/src/test/java/cn/celess/blog/service/serviceimpl/VisitorServiceImplTest.java
@@ -0,0 +1,30 @@
+package cn.celess.blog.service.serviceimpl;
+
+import cn.celess.blog.BaseTest;
+import cn.celess.blog.entity.model.PageData;
+import cn.celess.blog.entity.model.VisitorModel;
+import cn.celess.blog.service.VisitorService;
+import com.alibaba.druid.util.StringUtils;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import static org.junit.Assert.*;
+
+public class VisitorServiceImplTest extends BaseTest {
+
+ @Autowired
+ VisitorService visitorService;
+
+ @Test
+ public void location() {
+ assertEquals("0|0|0|内网IP|内网IP", visitorService.location("127.0.0.1"));
+ }
+
+ @Test
+ public void visitorPage() {
+ long start = System.currentTimeMillis();
+ PageData visitorModelPageData = visitorService.visitorPage(1, 10, true);
+ assertTrue(System.currentTimeMillis() - start <= 1500);
+ assertTrue(visitorModelPageData.getList().stream().noneMatch(visitor -> StringUtils.isEmpty(visitor.getLocation())));
+ }
+}
\ No newline at end of file
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