0


在java项目中使用Ip2Region离线开源API实现IP归属地转换

背景:

  1. 目前几乎各种平台都被要求显示发文作者所在地区信息,不管是发表文章、视频、还是评论等,都明确要求显示地区信息。而通过IP地址查询所属归属地,自然而然就成为了一个可行的实现方案。

实现方案:

  1. 花钱的方案:网上一搜一大片,各种档次的收费api支持;
  2. 免费的方案:
  3. 通过爬虫的方式爬取一些ip查询网站的查询结果(容易被封,且如果对方网站有更新无法及时做出响应);
  4. 寻找一些开源项目支持;(本文选择此方案,开源项目用的是Ip2Region
  5. **ip2region介绍**:
  6. 一个离线ip位置定位库和ip定位数据管理框架,10微秒级的查询效率,提供主流编程语言的xdb数据生成和查询客户端实现。
  7. 离线库xdb文件(具体文件可从项目地址中的data目录下找到并下载,项目地址见文末)大小约11MB
  8. Region默认格式:国家|区域|省份|城市|ISP,区域信息默认为0Region信息支持自定义。

开发环境:

  1. java(jdk8)+maven
  2. 注:ip2region支持各种主流语言,本文中只是使用了java的版本
  3. ![](https://i-blog.csdnimg.cn/blog_migrate/8b6c42c006bfb92d7a4fc9c382f85ca3.png)

编码实现:

pom.xml中引入ip2region依赖:

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

代码实现:

  1. public class IP2RegionTest {
  2. public static void main(String[] args) {
  3. String xdbPath = "C:\\tmp\\ip2region.xdb";
  4. // 1、创建Searcher对象
  5. Searcher searcher = null;
  6. try {
  7. // 第一种方式:通过离线文件路径创建Searcher,注:如果是并发使用,每个线程需要创建一个searcher而不是共用,否则会有线程安全问题
  8. //searcher = Searcher.newWithFileOnly(xdbPath);
  9. // 第二种方式:使用vIndex创建Searcher,如果是并发使用,每个线程需要创建一个searcher而不是共用,否则会有线程安全问题
  10. byte[] buff = Searcher.loadContentFromFile(xdbPath);
  11. // searcher = Searcher.newWithVectorIndex(xdbPath, buff);
  12. // 第三种方式:缓存整个xdb数据,可用于并发使用的场景,也就是每个线程可共享一个searcher,
  13. searcher = Searcher.newWithBuffer(buff);
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. return;
  17. }
  18. // 2、查询ip归属地
  19. // String ip = "114.112.77.166";//国内
  20. String ip = "23.103.134.95";//国外
  21. try {
  22. long start = System.nanoTime();
  23. String region = searcher.search(ip);
  24. long cost = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
  25. System.out.printf("{region:%s, ioCount:%d, took: %d us}\n", region, searcher.getIOCount(), cost);
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. // 3、关闭资源
  30. try {
  31. searcher.close();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

输出:

以上为离线调用的方式,亲自国内、国外ip的支持都比较友好,准确率也挺高(据说有99.9%)。

如果想要实现ip库的更新,请参考官网中的介绍

ip2region项目地址:

github:ip2region的githup

gitee:访问不了github的也可以访问gitee中的项目


本文转载自: https://blog.csdn.net/github_38727595/article/details/136716716
版权归原作者 Jack_abu 所有, 如有侵权,请联系我们删除。

“在java项目中使用Ip2Region离线开源API实现IP归属地转换”的评论:

还没有评论