2020-11-25
作者:互联网
一、 什么是ip2region
ip2region:可以根据他获取一个具体ip的信息,国家、具体地址、网络服务商
二、添加依赖
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7</version>
</dependency>
三、工具类
public class AddressUtils {
/**
* 根据IP地址获取地理位置
*/
public static String getAddressByIP(String ip) {
if (StringUtils.isBlank(ip)) {
return "";
}
if ("127.0.0.1".equals(ip)||"0:0:0:0:0:0:0:1".equals(ip)) {
return "局域网,无法获取位置";
}
// //开发时使用的代码
// String dbPath = AddressUtils.class.getResource("/ip2region.db").getPath();
// File file = new File(dbPath);
// if ( file.exists() == false ) {
// System.out.println("Error: Invalid ip2region.db file");
// }
// //查询算法
int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree
// //DbSearcher.BINARY_ALGORITHM //Binary
// int algorithm =DbSearcher.MEMORY_ALGORITYM; //Memory
// try {
// DbConfig config = new DbConfig();
// DbSearcher searcher = new DbSearcher(config, dbPath);
// //define the method
// 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 = null;
// if (Util.isIpAddress(ip) == false ) {
// System.out.println("Error: Invalid ip address");
// }
// dataBlock = (DataBlock) method.invoke(searcher, ip);
// return dataBlock.getRegion();
//部署时使用的代码
try{
// 读取jar包内的配置文件信息
ClassPathResource resource = new ClassPathResource("/ip2region.db");
InputStream inputStream = resource.getInputStream();
byte[] dbBinStr = IoUtil.readBytes(inputStream);
DbConfig config = new DbConfig();
DbSearcher searcher = new DbSearcher(config, dbBinStr);
// 查询算法memory,采用二进制方式初始化DBSearcher需要使用MEMORY_ALGORITYM,
//否则会抛出null。
Method method = searcher.getClass().getMethod("memorySearch", String.class);
return ((DataBlock) method.invoke(searcher, ip)).getRegion();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
三、遇到的错误
如我上面工具类所写的,开发时的代码和部署时的代码是不一样的,这是因为,ip2region所依赖的ip2region文件(如下:)在打包成jar时,使用开发时所写的代码是读取不到的,必须以部署时的代码,才能读取到。
这个问题的参考文章
标签:11,25,ip2region,String,searcher,ip,DbSearcher,2020,method 来源: https://blog.csdn.net/cristianoxm/article/details/110110167