前言

因为最近有个需求需要根据客户端登录的ip地址进行城市定位,获取到用户的登录城市,网上查了一下,也借鉴了一些博客,我自己也使用ip2region自己写了一个

获取到客户端的ip地址

该步骤参考我以前的文章 获取客户端ip地址

引入依赖

1
2
3
4
5
  <dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>

需要的文件下载地址

db文件下载地址,https://gitee.com/lionsoul/ip2region/tree/master/data 下载下来后解压,db文件在data目录下

新建 IpUtil 工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class IpUtil {
public static String getCityInfo(String ip) {
// db文件下载地址,https://gitee.com/lionsoul/ip2region/tree/master/data 下载下来后解压,db文件在data目录下
String dbPath = "G:\\IpData\\ip2region.db";
File file = new File(dbPath);
if (file.exists() == false) {
System.out.println("Error: Invalid 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;
}
if (Util.isIpAddress(ip) == false) {
System.out.println("Error: Invalid ip address");
}
DataBlock dataBlock = (DataBlock) method.invoke(searcher, ip);
return dataBlock.getRegion();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

测试

1
2
3
4
5
6
7
8
public static void main(String[] args) {
String cityIpString = getCityInfo("218.88.22.78");
String[] splitIpString = cityIpString.split("\\|");
String province = splitIpString[2].replaceAll("\\省", "");
String city = splitIpString[3].replaceAll("\\市", "");
System.out.println(province);
System.out.println(city);
}

结语

正常情况下就能够正确获取到客户端登录用户的城市了,你也可以自己试一试哦,反正不要钱,哈哈哈哈哈……