0


在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的版本

    ![](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 所有, 如有侵权,请联系我们删除。

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

还没有评论