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