概述
Geo IP lib (ip 地址库)的使用
1. Geo IP lib 地址库说明
如果有以下需求 请参考下面的文档:
如果需要通过IP查询到这个IP所对应的地址就使用 GeoLite2-City.mmdb 数据库文件进行ip的解析 .
2. 下载地址
2.1 Geo IP 官网地址
2.2 库源文件地址: (此链接已经配置了私钥可以直接下载).
2.3 校验文件地址: (此链接已经配置了私钥可以直接下载).
2.4 以上 第二个连接就是IP库的下载地址 已经配置了秘钥为永久地址, 此版本是免费版本的, 所以有一些ip查询不出来, 基本上都是1周左右官方就会更新一次 ip库. 所以这个文件也是需要更新的要不然对应一些比较特殊的ip就会出现查询错误, 或者查询不出来的情况. 所以需要写一个程序每天去获取一下最新的ip库信息并保存到resource目录 重新加载应用.
3. java代码解析数据库文件
3.1. maven 引入jar包
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.8.1</version>
</dependency>
将 下载下来的 GeoLite2-City.mmdb 文件, 拷贝到工程的 resource目录下面.
3.2. 代码使用解析ip
@Data
public class IPAddressDomain {
private String ip = "";
// 国家代码简称
private String countrySimpleCode = "";
// 国家英文名称
private String countryEnglishName = "";
// 省份 simple代码
private String subdivisionSimpleCode = null;
// 省份 英文名称
private String subdivisionEnglisName = null;
private String cityEnglishName = "";
private String citySimpleCode = "";
// 纬度
private String latitude = "0";
// 经度
private String longitude = "0";
}
/**
* @Description: ip 相关工具类
* @author sunyalong
*/
public class IpUtils {
public static DatabaseReader reader = null;
public static Lock lock = new ReentrantLock();
public static String getIpAddr(HttpServletRequest request){
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/**
* 初始化省市区内容到内存
*
* @param inputStream
* @throws IOException
*/
private static void init(InputStream inputStream) throws IOException {
try {
lock.lock();
// 读取数据库内容
reader = new DatabaseReader.Builder(inputStream).build();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
/**
* 通过一个 ip地址查询这个ip地址 代表 那个城市 使用方法参考 )
* @param inputStream 给一个ip查询的文件
* @param inetAddress ip的一个包装 InetAddress.getByName("171.108.233.157");
* @return
* @throws IOException
* @throws GeoIp2Exception
*/
public static IPAddressDomain findCityByIp(InputStream inputStream,InetAddress inetAddress) throws IOException, GeoIp2Exception {
if(reader == null){
init(inputStream);
}
// 返回对象
IPAddressDomain ipAddressDomain = new IPAddressDomain();
CityResponse response = reader.city(inetAddress);
// 获取国家信息
Country country = response.getCountry();
ipAddressDomain.setCountrySimpleCode(country.getIsoCode());
ipAddressDomain.setCountryEnglishName(country.getName());
ipAddressDomain.setIp(inetAddress.getHostAddress());
// 获取省份
Subdivision subdivision = response.getMostSpecificSubdivision();
ipAddressDomain.setSubdivisionSimpleCode(subdivision.getIsoCode());
ipAddressDomain.setSubdivisionEnglisName(subdivision.getName());
// 获取城市
City city = response.getCity();
ipAddressDomain.setCityEnglishName(city.getName());
ipAddressDomain.setCitySimpleCode(String.valueOf(city.getGeoNameId()));
Postal postal = response.getPostal();
ipAddressDomain.setCitySimpleCode(postal.getCode());
Location location = response.getLocation();
ipAddressDomain.setLatitude(location.getLatitude().toString());
ipAddressDomain.setLongitude(location.getLongitude().toString());
return ipAddressDomain;
}
}
public static void main(String[] args) throws Exception {
String ip = null;
// 深圳百度
// ip = "14.215.177.39";
// 上海阿里云
// ip = "106.11.253.83";
// 美国
ip = "40.79.78.1";
InputStream ins = getClass().getClassLoader().getResourceAsStream("GeoLite2-City.mmdb");
InetAddress ipAddress = InetAddress.getByName(ip);
IPAddressDomain cityByIp = IpUtils.findCityByIp(ins, ipAddress);
// 有些ip只可以查询到国家 查询不到 城市 这个情况就给他设置一个默认城市, 这个默认城市就填写找不到城市的 城市code 和 name
if (StringUtils.isNotBlank(cityByIp.getCountryEnglishName()) && StringUtils.isBlank(cityByIp.getCityEnglishName())) {
cityByIp.setCityEnglishName("unCity");
cityByIp.setCitySimpleCode("00404");
}
System.out.printli(ipAddress)
}
到此ip库解析结束. 下一篇将解决 自动更新 mmdb文件的问题
其他语言API 参考: 地址
这个IP 工具有些IP 无法查询到 请参考下一篇可以免费查询到 全球IP IP 网段查询https://blog.csdn.net/qq_40158629/article/details/107857759
最后
以上就是开心苗条为你收集整理的GeoLite2 City库的基本使用与下载, 通过ip查询地址的全部内容,希望文章能够帮你解决GeoLite2 City库的基本使用与下载, 通过ip查询地址所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复