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

背景:

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

实现方案:

        花钱的方案:网上一搜一大片,各种档次的收费api支持;

        免费的方案:

                通过爬虫的方式爬取一些ip查询网站的查询结果(容易被封,且如果对方网站有更新无法及时做出响应);

                寻找一些开源项目支持;(本文选择此方案,开源项目用的是Ip2Region)

        ip2region介绍

                一个离线ip位置定位库和ip定位数据管理框架,10微秒级的查询效率,提供主流编程语言的xdb数据生成和查询客户端实现。

                离线库xdb文件(具体文件可从项目地址中的data目录下找到并下载,项目地址见文末)大小约11MB。

                Region默认格式:国家|区域|省份|城市|ISP,区域信息默认为0。Region信息支持自定义。

开发环境:

        java(jdk8)+maven

        注:ip2region支持各种主流语言,本文中只是使用了java的版本

        

编码实现:

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中的项目

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值