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不怎么准确,不建议生产使用,如果不在意准确率的,可以使用。
原创内容,如果你觉得文章还可以的话,不妨点个赞支持一下!转载请注明出处。