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