使用 ip2region 或 geoip2 根据用户ip获取用户省市

使用 ip2region 或 geoip2 根据用户ip获取用户省市

这两种方式都不能获取到区县级别
简单的测试 中感觉 geoip 不如 ip2region 精确,而且 ip2region 的数据库文件也要小一些

ip2region

官方地址: https://github.com/lionsoul2014/ip2region/tree/master

在pom中引入内容

<dependency>  
    <groupId>org.lionsoulgroupId>  
    <artifactId>ip2regionartifactId>  
    <version>2.7.0version>  
dependency>

代码示例

import org.lionsoul.ip2region.xdb.Searcher;
public String testIp2Region() {  
    // 测试的ip地址  
    String ip = "112.13.53.138";  
    // 获取resource下的xdb文件  
    String dbPath = Object.class.getResource("/ip2region.xdb").getPath();  
    // 1、从 dbPath 加载整个 xdb 到内存。  
    byte[] cBuff;  
    try {  
        cBuff = Searcher.loadContentFromFile(dbPath);  
    } catch (Exception e) {  
        System.out.printf("failed to load content from `%s`: %s\n", dbPath, e);  
        return null;    
    }  
  
    // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。  
    Searcher searcher;  
    try {  
        searcher = Searcher.newWithBuffer(cBuff);  
    } catch (Exception e) {  
        System.out.printf("failed to create content cached searcher: %s\n", e);  
        return null;    
    } 
  
    // 3、查询  
    try {
	    // 结果的固定格式 国家|区域|省份|城市|ISP 缺省补0
	    // 这里区域没有获取到 补了0
        String region = searcher.search(ip);
        System.out.printf(region); // 中国|0|浙江省|温州市|移动  
        return region;  
    } catch (Exception e) {  
        System.out.printf("failed to search(%s): %s\n", ip, e);  
    }  
    return null;  
}

geoip2

官方下载地址需要注册: https://www.maxmind.com/en/accounts/current/geoip/downloads

我是在这里下载的: https://github.com/P3TERX/GeoLite.mmdb?tab=readme-ov-file

在pom中引入内容

<dependency>  
    <groupId>com.maxmind.geoip2groupId>  
    <artifactId>geoip2artifactId>  
    <version>2.12.0version>  
dependency>

代码示例

import com.maxmind.geoip2.DatabaseReader;  
import com.maxmind.geoip2.model.CityResponse;  
import com.maxmind.geoip2.record.*;
public void testGeoip() {  
    // 测试ip  
    String ip = "112.13.53.138";  
    // GeoIP2-City 数据库文件  
    String dbPath = Object.class.getResource("/GeoLite2-City.mmdb").getPath();  
    File database = new File(dbPath);  
  
    // 创建 DatabaseReader对象  
    try {  
        DatabaseReader reader = new DatabaseReader.Builder(database).build();  
        InetAddress ipAddress = InetAddress.getByName(ip);  
        CityResponse response = reader.city(ipAddress);  
  
        Country country = response.getCountry();  
        System.out.println(country.getIsoCode());  
        System.out.println(country.getName()); // 国家  
        System.out.println(country.getNames().get("zh-CN")); // 国家中文  
  
        Subdivision subdivision = response.getMostSpecificSubdivision();  
        System.out.println(subdivision.getIsoCode());  
        System.out.println(subdivision.getName()); // 省市  
        System.out.println(subdivision.getNames().get("zh-CN"));// 省市中文  
  
        City city = response.getCity();  
        System.out.println(city.getName()); // 城市  
        System.out.println(city.getNames().get("zh-CN"));// 城市中文  
  
        Location location = response.getLocation();  
        System.out.println(location.getLatitude());  // 纬度  
        System.out.println(location.getLongitude()); // 经度  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}

你可能感兴趣的:(JAVA,java,ip2region,ip归属地)