Java获取IP归属地

Java获取IP归属地

一、ip2region库

ip2region:是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。

  • IP 数据管理框架,固定格式:国家|区域|省份|城市|ISP
  • 数据去重和压缩
  • 极速查询响应:十微秒级别
  • 支持多种语言

下载地址:https://gitee.com/lionsoul/ip2region

代码如下

引入pom依赖

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

核心库文件

// 将下载的ip2region.xdb放于spring项目的资源目录下
"/ip2region/ip2region.xdb"

核心工具类

package com.qiangesoft.ip.util;

import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.util.FileCopyUtils;

import java.io.IOException;
import java.io.InputStream;

/**
 * ip转地址工具类
 *
 * @author qiangesoft
 * @date 2024-02-01
 */
public class Ip2regionUtil {

    private static Searcher searcher;

    public static void main(String[] args) {
        String ip2region = getIp2region("171.223.209.192");
        System.out.println(ip2region);
    }

    /**
     * 在服务启动时加载ip2region.db到内存中
     */
    static {
        try {
            InputStream inputStream = Ip2regionUtil.class.getResourceAsStream("/ip2region/ip2region.xdb");
            byte[] byteArray = FileCopyUtils.copyToByteArray(inputStream);
            // 缓存xdb数据
            searcher = Searcher.newWithBuffer(byteArray);
            // 基于文件查询
            // Searcher.newWithFileOnly("/ip2region/ip2region.xdb");
            // 缓存VectorIndex索引
            // Searcher.newWithVectorIndex("/ip2region/ip2region.xdb", null);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 根据ip2region解析ip地址
     *
     * @param ip
     * @return
     */
    public static String getIp2region(String ip) {
        if (searcher == null) {
            return null;
        }

        try {
            return searcher.search(ip);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

使用

@GetMapping("/ip2region")
public Region ip2region(String ip) {
    long start = System.currentTimeMillis();

    String address = Ip2regionUtil.getIp2region(ip);
    String[] split = address.split("\\|");
    Region region = new Region();
    region.setCountry(split[0]);
    region.setProvince(split[2]);
    region.setCity(split[3]);
    region.setIsp(split[4]);

    long end = System.currentTimeMillis();
    System.out.println("接口ip2region耗时为:" + (end - start));
    return region;
}

二、mica-ip2region

如梦技术基于ip2region做了封装,效率更高,使用更方便

引入依赖


<dependency>
   <groupId>net.dreamlugroupId>
   <artifactId>mica-ip2regionartifactId>
   <version>2.5.4version>
dependency>

使用

@Autowired
private Ip2regionSearcher ip2regionSearcher;

@GetMapping("/mica")
public Region mica(String ip) {
    long start = System.currentTimeMillis();

    IpInfo ipInfo = ip2regionSearcher.memorySearch(ip);
    Region region = new Region();
    region.setCountry(ipInfo.getCountry());
    region.setProvince(ipInfo.getProvince());
    region.setCity(ipInfo.getCity());
    region.setIsp(ipInfo.getIsp());

    long end = System.currentTimeMillis();
    System.out.println("接口mica耗时为:" + (end - start));
    return region;
}

你可能感兴趣的:(Java案例,java,ip,IP归属地)