ip2region解析ip获取地区位置

1.依赖

        <dependency>
            <groupId>org.lionsoul</groupId>
            <artifactId>ip2region</artifactId>
            <version>2.7.0</version>
        </dependency>

2.加入ip2region.xdb文件

下载链接

3.加入到项目里面去

把 ip2region.xdb 文件放到 resources 文件夹里面的去



在Maven里面添加依赖,防止把这个xdb文件编译:


<plugin>
  <artifactId>maven-resources-plugin</artifactId>
   <configuration>
    <nonFilteredFileExtensions>
         <nonFilteredFileExtension>xdb</nonFilteredFileExtension>
       </nonFilteredFileExtensions>
     </configuration>
</plugin>

4.工具类

package com.example.demo.util;

import lombok.extern.slf4j.Slf4j;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.core.io.ClassPathResource;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * ip解析工具
 *
 * @author zzt
 * @version v1.0.0
 * @date 2023/6/9 9:26
 */
@Slf4j
public class IpParseUtil {

    /**
     * 将整个xdb文件加载到内存中(11M左右),此种创建方式支持多线程,因此只需要加载一次
     */
    private final static Searcher SEARCHER;

    static {
        try {
            ClassPathResource resource = new ClassPathResource("ip2region.xdb");
            //获取真实文件路径
            String path = resource.getURL().getPath();
            byte[] cBuff = Searcher.loadContentFromFile(path);
            SEARCHER = Searcher.newWithBuffer(cBuff);
            log.info("加载了ip2region.xdb文件,Searcher初始化完成!");
        } catch (Exception e) {
            log.error("初始化ip2region.xdb文件失败,报错信息:[{}]", e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
    }


    /**
     * 解析ip地址
     *
     * @param ipStr 字符串类型ip 例:192.168.0.1
     * @return 返回结果形式(国家|区域|省份|城市|ISP) 例 [中国, 0, 河北省, 衡水市, 电信]
     */
    public static List<String> parse(String ipStr) {
        return parse(ipStr, null);
    }

    /**
     * 自定义解析ip地址
     *
     * @param ipStr ip 字符串类型ip 例:1970753539(经过转换后的)
     * @param index 想要获取的区间 例如:只想获取 省,市 index = [2,3]
     * @return 返回结果例 [北京,北京市]
     */
    public static List<String> parse(String ipStr, int[] index) {
        try {
            long ip = Searcher.checkIP(ipStr);
            return parse(ip, index);
        } catch (Exception e) {
            log.error("ip解析为long错误,ipStr:[{}],错误信息:[{}]", ipStr, e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
    }

    /**
     * 自定义解析ip地址
     *
     * @param ip    ip Long类型ip
     * @param index 想要获取的区间 例如:只想获取 省,市 index = [2,3]
     * @return 返回结果例 [河北省, 衡水市]
     */
    public static List<String> parse(Long ip, int[] index) {
        //获取xdb文件资源
        List<String> regionList = new ArrayList<>();
        try {
            String region = SEARCHER.search(ip);
            String[] split = region.split("\\|");
            if (index == null) {
                regionList = Arrays.asList(split);
            } else {
                for (int i : index) {
                    regionList.add(split[i]);
                }
            }
            //关闭资源
            SEARCHER.close();
        } catch (Exception e) {
            log.error("根据ip解析地址失败,ip:[{}],index[{}],报错信息:[{}]", ip, index, e.getMessage(), e);
            throw new RuntimeException("系统异常!");
        }
        return regionList;
    }

    /**
     * 获取IP方法
     *
     * @author ruoyi
     */
    public static String getIpAddr(HttpServletRequest request)
    {
        if (request == null)
        {
            return "unknown";
        }
        String ip = request.getHeader("x-forwarded-for");
        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("X-Forwarded-For");
        }
        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("X-Real-IP");
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getRemoteAddr();
        }
        return ip;
    }


    public static void main(String[] args) {

        String ip = "112.96.63.11";
        List<String> parse = parse(ip);
        System.out.println(parse);
    }

}

执行main方法:



结果:

5. 注意事项:

1.部署到线上之后:出现java文件操作报错:java.io.FileNotFoundException

解决方法:【已解决】在linux部署出现java文件操作报错:java.io.FileNotFoundException-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!要在Spring Boot中集成ip2region,首先需要引入ip2region的依赖。可以在`pom.xml`文件中添加以下配置: ```xml <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>1.7.2</version> </dependency> ``` 接下来,创建一个`IpUtil`工具类,如下所示: ```java package com.example.demo.util; import org.lionsoul.ip2region.*; import java.io.IOException; public class IpUtil { public static String getCityInfo(String ip) { try { // 使用ip2region.db文件,创建DbSearcher对象 String dbPath = IpUtil.class.getResource("/ip2region.db").getPath(); DbSearcher searcher = new DbSearcher(new DbConfig(), dbPath); // 解析IP地址,获取城市信息 DataBlock dataBlock = searcher.btreeSearch(ip); String region = dataBlock.getRegion(); String[] regionArr = region.split("\\|"); return regionArr[2]; } catch (DbMakerConfigException | IOException | DbSearcherException e) { e.printStackTrace(); } return null; } } ``` 该`IpUtil`工具类中,使用`ip2region.db`文件创建一个`DbSearcher`对象,然后使用该对象解析IP地址,获取城市信息。 最后,在需要使用IP地址获取城市信息的地方,调用`IpUtil`工具类的`getCityInfo`方法即可,如下所示: ```java String ip = "127.0.0.1"; String cityInfo = IpUtil.getCityInfo(ip); System.out.println(cityInfo); // 输出:本机地址 ``` 注意,`ip2region.db`文件需要放在`resources`目录下。另外,`ip2region.db`文件可以从[ip2region](https://github.com/lionsoul2014/ip2region/releases)的GitHub仓库中下载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值