Merge branch 'feature-ip2region'
This commit is contained in:
9
pom.xml
9
pom.xml
@@ -180,19 +180,16 @@
|
|||||||
<artifactId>jaxb-api</artifactId>
|
<artifactId>jaxb-api</artifactId>
|
||||||
<version>2.3.0</version>
|
<version>2.3.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
<groupId>com.sun.xml.bind</groupId>
|
||||||
<artifactId>jaxb-impl</artifactId>
|
<artifactId>jaxb-impl</artifactId>
|
||||||
<version>2.3.0</version>
|
<version>2.3.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
<groupId>com.sun.xml.bind</groupId>
|
||||||
<artifactId>jaxb-core</artifactId>
|
<artifactId>jaxb-core</artifactId>
|
||||||
<version>2.3.0</version>
|
<version>2.3.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.activation</groupId>
|
<groupId>javax.activation</groupId>
|
||||||
<artifactId>activation</artifactId>
|
<artifactId>activation</artifactId>
|
||||||
@@ -200,6 +197,12 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.lionsoul</groupId>
|
||||||
|
<artifactId>ip2region</artifactId>
|
||||||
|
<version>1.7.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import cn.celess.blog.entity.model.VisitorModel;
|
|||||||
import cn.celess.blog.exception.MyException;
|
import cn.celess.blog.exception.MyException;
|
||||||
import cn.celess.blog.mapper.VisitorMapper;
|
import cn.celess.blog.mapper.VisitorMapper;
|
||||||
import cn.celess.blog.service.VisitorService;
|
import cn.celess.blog.service.VisitorService;
|
||||||
|
import cn.celess.blog.util.AddressUtil;
|
||||||
import cn.celess.blog.util.DateFormatUtil;
|
import cn.celess.blog.util.DateFormatUtil;
|
||||||
import cn.celess.blog.util.RedisUtil;
|
import cn.celess.blog.util.RedisUtil;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
@@ -151,60 +152,7 @@ public class VisitorServiceImpl implements VisitorService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private String getLocation(String ip) {
|
private String getLocation(String ip) {
|
||||||
StringBuilder result = new StringBuilder();
|
return AddressUtil.getCityInfo(ip);
|
||||||
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<String, Object> 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();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
71
src/main/java/cn/celess/blog/util/AddressUtil.java
Normal file
71
src/main/java/cn/celess/blog/util/AddressUtil.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
src/main/resources/ip2region/ip2region.db
Normal file
BIN
src/main/resources/ip2region/ip2region.db
Normal file
Binary file not shown.
@@ -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<VisitorModel> visitorModelPageData = visitorService.visitorPage(1, 10, true);
|
||||||
|
assertTrue(System.currentTimeMillis() - start <= 1500);
|
||||||
|
assertTrue(visitorModelPageData.getList().stream().noneMatch(visitor -> StringUtils.isEmpty(visitor.getLocation())));
|
||||||
|
}
|
||||||
|
}
|
||||||
15
src/test/java/cn/celess/blog/util/AddressUtilTest.java
Normal file
15
src/test/java/cn/celess/blog/util/AddressUtilTest.java
Normal file
@@ -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"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user