JAVA使用geoip2库解析IP地址信息

geoip2是一个国外提供IP数据库的,提供有免费的IP数据库,只需要注册他们的账号即可下载IP数据库。

  • 官方网站
https://www.maxmind.com/
  • maven 仓库地址
<dependency>
    <groupId>com.maxmind.geoip2</groupId>
    <artifactId>geoip2</artifactId>
    <version>2.16.1</version>
</dependency>

java11以下使用2.x版,3.x需要java11。

  • 在官网可下载到一个 GeoLite2-xxx.mmdb 的数据库文件,这个文件就是IP数据库,sdk需要该数据库才能使用,不想自己下的可以私我。
  • 编写工具类,工具类使用到hutool,不知道的自行百度。
// GeoIp2Analysis.java
import cn.hutool.core.io.FileUtil;
import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.exception.GeoIp2Exception;
import com.maxmind.geoip2.model.CityResponse;
import com.maxmind.geoip2.record.City;
import com.maxmind.geoip2.record.Country;
import com.maxmind.geoip2.record.Subdivision;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.net.InetAddress;

/**
 * Geoip工具类,使用单例模式(双重校验锁DCL).
 * GeoLite2-City.mmdb 不太准确
 *
 * @author lixingwu
 * @date 2022-05-23 14:27:00
 */
@Slf4j
public class GeoIp2Analysis {

    private volatile static GeoIp2Analysis geoIp2Analysis;

    /*** 
     * DatabaseReader,用于加载ip数据库 
     */
    private DatabaseReader reader;

    /***
     * TODO:自行修改ip数据库位置
     */
    private static final String GEO_LITE2_MMDB_FILE_PATH = "D:\\develop\\vote\\vote-api\\vote-all\\src\\data\\GeoLite2-City.mmdb";

    private GeoIp2Analysis() {
        // 初始化加载文件
        try {
            log.info("装载IP数据库文件...");
            File geoLite2MmdbFile = FileUtil.file(GEO_LITE2_MMDB_FILE_PATH);
            reader = new DatabaseReader.Builder(geoLite2MmdbFile).build();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("IP数据库[{}]装载失败,{}", GEO_LITE2_MMDB_FILE_PATH, e.getMessage());
        }
    }

    /**
     * 获取IP解析单例
     *
     * @return GeoIp2Analysis
     */
    public static GeoIp2Analysis getInstance() {
        if (geoIp2Analysis == null) {
            synchronized (GeoIp2Analysis.class) {
                if (geoIp2Analysis == null) {
                    geoIp2Analysis = new GeoIp2Analysis();
                }
            }
        }
        return geoIp2Analysis;
    }

    // TODO:此处只是打印了信息,根据实际情况修改
    public void getIpInfo(String ip) throws IOException, GeoIp2Exception {
        InetAddress address = InetAddress.getByName(ip);
        CityResponse response = reader.city(address);
        Country country = response.getCountry();
        Subdivision subdivision = response.getMostSpecificSubdivision();
        City city = response.getCity();
        log.info("{} {} {}",
                country.getNames().get("zh-CN"),
                subdivision.getNames().get("zh-CN"),
                city.getNames().get("zh-CN")
        );
    }

    // TODO:测试
    public static void main(String[] args) throws IOException, GeoIp2Exception {
        GeoIp2Analysis.getInstance().getIpInfo("124.205.155.148");
        GeoIp2Analysis.getInstance().getIpInfo("27.105.130.93");
        GeoIp2Analysis.getInstance().getIpInfo("124.205.155.150");
        GeoIp2Analysis.getInstance().getIpInfo("124.205.155.156");
        GeoIp2Analysis.getInstance().getIpInfo("112.250.107.37");
        GeoIp2Analysis.getInstance().getIpInfo("116.17.102.220");
        GeoIp2Analysis.getInstance().getIpInfo("14.29.139.251");
        GeoIp2Analysis.getInstance().getIpInfo("121.8.215.106");
    }

}
  • 输出
16:42:55.938 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 装载IP数据库文件...
16:42:56.093 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 中国 北京市 北京
16:42:56.096 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 台湾 null null
16:42:56.097 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 中国 北京市 北京
16:42:56.097 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 中国 北京市 北京
16:42:56.098 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 中国 山东省 篦子店
16:42:56.099 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 中国 null null
16:42:56.099 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 中国 北京市 北京
16:42:56.100 [main] INFO com.yunding.vote.util.GeoIp2Analysis - 中国 广东 广州市

最后,geoip2是一个国外的免费的IP数据库,国内的IP不怎么准确,不建议生产使用,如果不在意准确率的,可以使用。

posted @ 2022-05-23 17:11  喵喵扑  阅读(3649)  评论(3编辑  收藏  举报