背景:
目前几乎各种平台都被要求显示发文作者所在地区信息,不管是发表文章、视频、还是评论等,都明确要求显示地区信息。而通过IP地址查询所属归属地,自然而然就成为了一个可行的实现方案。
实现方案:
花钱的方案:网上一搜一大片,各种档次的收费api支持;
免费的方案:
通过爬虫的方式爬取一些ip查询网站的查询结果(容易被封,且如果对方网站有更新无法及时做出响应);
寻找一些开源项目支持;(本文选择此方案,开源项目用的是Ip2Region)
**ip2region介绍**:
一个离线ip位置定位库和ip定位数据管理框架,10微秒级的查询效率,提供主流编程语言的xdb数据生成和查询客户端实现。
离线库xdb文件(具体文件可从项目地址中的data目录下找到并下载,项目地址见文末)大小约11MB。
Region默认格式:国家|区域|省份|城市|ISP,区域信息默认为0。Region信息支持自定义。
开发环境:
java(jdk8)+maven
注:ip2region支持各种主流语言,本文中只是使用了java的版本
![](https://i-blog.csdnimg.cn/blog_migrate/8b6c42c006bfb92d7a4fc9c382f85ca3.png)
编码实现:
pom.xml中引入ip2region依赖:
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>2.7.0</version>
</dependency>
代码实现:
public class IP2RegionTest {
public static void main(String[] args) {
String xdbPath = "C:\\tmp\\ip2region.xdb";
// 1、创建Searcher对象
Searcher searcher = null;
try {
// 第一种方式:通过离线文件路径创建Searcher,注:如果是并发使用,每个线程需要创建一个searcher而不是共用,否则会有线程安全问题
//searcher = Searcher.newWithFileOnly(xdbPath);
// 第二种方式:使用vIndex创建Searcher,如果是并发使用,每个线程需要创建一个searcher而不是共用,否则会有线程安全问题
byte[] buff = Searcher.loadContentFromFile(xdbPath);
// searcher = Searcher.newWithVectorIndex(xdbPath, buff);
// 第三种方式:缓存整个xdb数据,可用于并发使用的场景,也就是每个线程可共享一个searcher,
searcher = Searcher.newWithBuffer(buff);
} catch (IOException e) {
e.printStackTrace();
return;
}
// 2、查询ip归属地
// String ip = "114.112.77.166";//国内
String ip = "23.103.134.95";//国外
try {
long start = System.nanoTime();
String region = searcher.search(ip);
long cost = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
System.out.printf("{region:%s, ioCount:%d, took: %d us}\n", region, searcher.getIOCount(), cost);
} catch (Exception e) {
e.printStackTrace();
}
// 3、关闭资源
try {
searcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出:
以上为离线调用的方式,亲自国内、国外ip的支持都比较友好,准确率也挺高(据说有99.9%)。
如果想要实现ip库的更新,请参考官网中的介绍
ip2region项目地址:
github:ip2region的githup
gitee:访问不了github的也可以访问gitee中的项目
本文转载自: https://blog.csdn.net/github_38727595/article/details/136716716
版权归原作者 Jack_abu 所有, 如有侵权,请联系我们删除。
版权归原作者 Jack_abu 所有, 如有侵权,请联系我们删除。