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數據庫,不怎麼準確,不建議生產使用,如果不在意準確率的,可以使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章