IP归属地解析之离线纯真数据库分享

发布时间:2025-12-09 22:25:17 浏览次数:9

文章目录

  • 前言
  • 一、什么是IP离线纯真数据库
  • 二、GeoIP2
    • 1.引入库
    • 2. 代码实装
      • 2.1 数据获取
      • 2.2 数据位置
      • 2.3 编写测试类
      • 2.4 IP解析
  • 三、IP2Location
    • 1. 官方SDK文件获取
    • 2. 代码实装
      • 2.1 获取数据
      • 2.2 数据位置
      • 2.3 编写测试类
      • 2.4 IP解析
  • 四、dbIP
  • 五、数据免费下载
  • 总结

前言

能说算不上什么,有本事就把你的代码给我看看。—— Linus Torvalds,Linux 之父


一、什么是IP离线纯真数据库

今年上半年俄乌战争爆发,为了控制平台舆论,类似于抖音,微博等国内众多平台纷纷响应国家号召,开始进行IP的归属地显示。
这种可以通过IP地址来剥取到地理位置的做法目前实现起来主要有两种方式。

  • 使用第三方API接口,比如目前国内的搜狐接口,淘宝接口,这种方式好处是,无需资源本地化,靠接口即可完成数据的取得,但是弊端也很明显,请求时效性,速度因人而异。
  • 使用离线数据库,所谓的离线就是把IP库放到本地进行存储,然后通过自身的程序代码进行IP解析,相对更安全,快速。但是弊端就是IP地址不是长久不变的,IP是分配给给个运营商的,这个更新的频率可想而知,所以离线库就要考虑到数据的更新问题。
  • 目前主流的离线库主要要三种:

  • GeoIP2
  • IP2Location
  • dbIP
  • 二、GeoIP2

    1.引入库

    <dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>3.0.1</version></dependency>

    2. 代码实装

    2.1 数据获取

    根据官网提示下载数据:链接: 官网
    数据有两种形式:
    1.MMDB结尾的二进制内置数据库
    2.CSV结尾的可提供导入本地MySql数据的数据

    2.2 数据位置

    推荐放在resources 目录下

    2.3 编写测试类

    //GeoIP2-City 数据库文件// 获取resources文件夹下的GeoIP2-City.mmdb文件 ,要获取绝对路径文件File database = new File(Thread.currentThread().getContextClassLoader().getResource("GeoLite2-City.mmdb").getPath());// 创建 DatabaseReader对象DatabaseReader reader = new DatabaseReader.Builder(database).build();InetAddress ipAddress = InetAddress.getByName("128.101.101.101");// Replace "city" with the appropriate method for your database, e.g.,// "country".CityResponse response = reader.city(ipAddress);Country country = response.getCountry();System.out.println(country.getIsoCode()); // 'US'System.out.println(country.getName()); // 'United States'System.out.println(country.getNames().get("zh-CN")); // '美国'Subpision subpision = response.getMostSpecificSubpision();System.out.println(subpision.getName()); // 'Minnesota'System.out.println(subpision.getIsoCode()); // 'MN'City city = response.getCity();System.out.println(city.getName()); // 'Minneapolis'Postal postal = response.getPostal();System.out.println(postal.getCode()); // '55455'Location location = response.getLocation();System.out.println(location.getLatitude()); // 44.9733System.out.println(location.getLongitude()); // -93.2323

    2.4 IP解析

    三、IP2Location

    1. 官方SDK文件获取


    可以自己选择自己想要的SDK进行封装拓展

    2. 代码实装

    2.1 获取数据

    根据官网提示下载数据:链接: 官网
    数据有两种形式:
    1.BIN结尾的二进制内置数据库
    2.CSV结尾的可提供导入本地MySql数据的数据

    2.2 数据位置

    推荐放在resources 目录下

    2.3 编写测试类

    IP2Location loc = new IP2Location();try {String ip = "8.8.8.8"; //定义IPString binfile = "IP2LOCATION-LITE-DB11.BIN"; Path binpath = Paths.get("src", "main", "resources", binfile); //获取数据文件String binfilepath = binpath.toFile().getAbsolutePath();loc.Open(binfilepath, true);IPResult rec = loc.IPQuery(ip);if ("OK".equals(rec.getStatus())) {System.out.println(rec);} else if ("EMPTY_IP_ADDRESS".equals(rec.getStatus())) {System.out.println("IP address cannot be blank.");} else if ("INVALID_IP_ADDRESS".equals(rec.getStatus())) {System.out.println("Invalid IP address.");} else if ("MISSING_FILE".equals(rec.getStatus())) {System.out.println("Invalid database path.");} else if ("IPV6_NOT_SUPPORTED".equals(rec.getStatus())) {System.out.println("This BIN does not contain IPv6 data.");} else {System.out.println("Unknown error." + rec.getStatus());}System.out.println("Java Component: " + rec.getVersion());} catch (Exception e) {System.out.println(e);e.printStackTrace(System.out);} finally {loc.Close();}

    2.4 IP解析

    四、dbIP

    dbIP属于一个第三方库,提供API结合和离线数据库,提供MMDB形式的数据库,需要配合类似GeoIP2的解析器进行解析,数据相对较GEOIP准确。


    下载地址

    五、数据免费下载

    下载链接: 点击0积分下载

    本来就免费的东西,更应该无偿分享。

    总结

    免费版本的离线数据都有不精确的误差,这是在所难免的,但是对于一般的业务使用场景已经完全够用了。
    GEOIP2免费版对语言的支持相对友好。

    需要做网站?需要网络推广?欢迎咨询客户经理 13272073477