Spring boot 集成ip2region.xdb,在jar包中的使用

依赖

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

				//maven拦截resource目录文件
 				<plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.2.0</version>
                    <configuration>
                        <nonFilteredFileExtensions>
                            <nonFilteredFileExtension>xdb</nonFilteredFileExtension>
                        </nonFilteredFileExtensions>
                    </configuration>
                </plugin>

代码

import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.lionsoul.ip2region.xdb.Searcher;

import java.io.File;
import java.io.InputStream;

/**
 * 根据ip查询地址
 */
@Slf4j
public final class AddressUtil {

    private static Searcher searcher = null;

    static {
        try {
            String dbPath = AddressUtil.class.getResource("/ip2region/ip2region.xdb").getPath();
            File file = new File(dbPath);
            if (!file.exists()) {
                String tmpDir = System.getProperties().getProperty("java.io.tmpdir");
                dbPath = (tmpDir.endsWith(File.separator) ? tmpDir : tmpDir + File.separator) + "ip2region.xdb";
                file = new File(dbPath);
                String classPath = "classpath:ip2region/ip2region.xdb";
                InputStream resourceAsStream = ResourceUtil.getStreamSafe(classPath);
                if (resourceAsStream != null) {
                    FileUtils.copyInputStreamToFile(resourceAsStream, file);
                }
            }
            // 1、从 dbPath 加载整个 xdb 到内存。
            byte[] cBuff = null;
            try {
                cBuff = Searcher.loadContentFromFile(dbPath);
            } catch (Exception e) {
                log.error("failed to load content from `%s`: %s\n", dbPath, e);
            }

            // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。
            try {
                searcher = Searcher.newWithBuffer(cBuff);
            } catch (Exception e) {
                log.error("failed to create content cached searcher: %s\n", e);
            }

            log.info("bean [{}]", searcher);
        } catch (Exception e) {
            log.error("init ip region error", e);
        }
    }

    private AddressUtil() {
    }

    /**
     * 解析IP
     *
     * @param ip ip
     * @return 地区
     */
    public static String getRegion(String ip) {
        try {
            //db
            if (searcher == null || StrUtil.isEmpty(ip)) {
                log.error("Searcher is null");
                return StrUtil.EMPTY;
            }
            long startTime = System.currentTimeMillis();
            String result = searcher.search(ip);
            long endTime = System.currentTimeMillis();
            log.debug("region use time[{}] result[{}]", endTime - startTime, result);
            return result;

        } catch (Exception e) {
            log.error("根据ip查询地区失败:", e);
        }
        return StrUtil.EMPTY;
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值