偶然学习到,根据ip地址区查询城市地址,首先得先获取一些ip对应的城市。
我是根据ip2region 数据库中进行查询的,将获取的IP地址与数据库中的数据进行匹配,可以确定该 IP 地址所属的地理位置信息。
maven需要导入依赖ip2region库,ip2region.db再资源中下载。
<!--ip库-->
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
public static String getIpAddress(String ip, int algorithm) {
// ip2region.db数据存放的路径
String path=FileUtil.getIp2regin()+"ip2region.db";
if (Util.isIpAddress(ip)) {
// 查询算法B-tree, Binary, Memory
DbSearcher searcher = null;
try {
DbConfig config = new DbConfig();
searcher = new DbSearcher(config, path);
Method method;
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:
default:
method = searcher.getClass().getMethod("memorySearch", String.class);
break;
}
DataBlock dataBlock = (DataBlock) method.invoke(searcher, ip);
List<String> list = Arrays.asList(dataBlock.getRegion().split("\\|")).stream().filter(s -> !"0".equals(s)).collect(Collectors.toList());
String ipAddress = StringUtils.join(list, ",");
String[] split = ipAddress.split(",");
return split[split.length-2];
} catch (Exception e) {
System.err.println("获取城市信息失败:"+e);
} finally {
try {
searcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else if ("127.0.0.1".equals(ip) || StringUtils.startsWith(ip, "192.168")) {
return "内网IP";
}
return DEFAULT_CITY_NAME;
}
仅供学习参考,所以数据不是最新的。ip2region 数据库可能存在一定的更新滞后性。新添加的 IP 地址或地理位置信息可能需要一定的时间才会被纳入到数据库中。因此,在某些情况下,可能会出现无法查询到特定 IP 地址对应城市的情况。此外,还有一些其他因素可能导致查询不到 IP 地址对应的城市信息,例如输入的 IP 地址错误、数据库文件缺失或损坏等。