线上环境ip2region解析ip归属地不对以及searcher.btreeSearch报空指针的两个问题探究

今天在做系统日志的功能时,需要根据ip获取客户端的归属地,于是决定使用ip2region工具来实现,但是在实际使用过程中(使用场景见springboot+aop+线程池+ip2region+mybatisplus实现异步系统日志记录),遇到了两个坑

1.程序正常运行,测试环境根据正常ip获取到的归属地全部为未知位置,同样的ip地址在本地测试获取到的却是正常归属地
2.解决坑1之后,又莫名其妙出现searcher.btreeSearch(ip)报空指针异常。

先说解决方案(最终版代码可到文末去取):

  1. 如果是springboot项目,用IpUtils.class.getClassLoader().getResourceAsStream(“ip2region.db”)代替IpUtils.class.getResource(“/ip2region.db”).getPath(),因此创建DbSearcher对象用DbSearcher(DbConfig
    dbConfig, byte[] dbBinStr)而不是DbSearcher( DbConfig dbConfig, String
    dbFile )
  2. 用memorySearch算法,而不是binarySearch算法和btreeSearch算法

接下来,踩坑和解决历程且听我娓娓道来。。。

问题探索历程

首先引入ip2region依赖

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

下载ip2region.db文件将他放到项目的resources目录下

在这里插入图片描述

编写IpUtils工具类

public final class IpUtils {
   

    private static final String UNKOWN_ADDRESS = "未知位置";

    /**
     * 根据IP获取地址
     *
     * @return 国家|区域|省份|城市|ISP
     */
    public static String getAddress(String ip) throws Exception {
   
        return getAddress(ip, DbSearcher.BTREE_ALGORITHM);
    }

	public static String getAddress(String ip, int algorithm) throws Exception {
   
        if (!Util.isIpAddress(ip)) {
   
            return UNKOWN_ADDRESS;
        }
        String dbPath = IpUtils.class.getResource("/ip2region.db").getPath();
        File file = new File(dbPath);
        if (!file.exists()) {
   
            return UNKOWN_ADDRESS;
        }
        DbSearcher searcher = new DbSearcher(new DbConfig(), dbPath);
        DataBlock dataBlock;
        switch (algorithm) {
   
            case DbSearcher.BTREE_ALGORITHM:
                dataBlock = searcher.btreeSearch(ip);
                break;
            case DbSearcher.BINARY_ALGORITHM:
                dataBlock = searcher.binarySearch(ip);
                break;
            case DbSearcher.MEMORY_ALGORITYM:
                dataBlock = searcher.memorySearch(ip);
                break;
            default:
                return UNKOWN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值