dengzedong
2024-12-19 85b2001c0ec2f1adc598db3bf47ad457dcca7074
提交 | 用户 | 时间
e7c126 1 package com.iailab.framework.ip.core.utils;
H 2
3 import cn.hutool.core.io.resource.ResourceUtil;
4 import com.iailab.framework.ip.core.Area;
5 import lombok.SneakyThrows;
6 import lombok.extern.slf4j.Slf4j;
7 import org.lionsoul.ip2region.xdb.Searcher;
8
9 import java.io.IOException;
10
11 /**
12  * IP 工具类
13  *
14  * IP 数据源来自 ip2region.xdb 精简版,基于 <a href="https://gitee.com/zhijiantianya/ip2region"/> 项目
15  *
16  * @author wanglhup
17  */
18 @Slf4j
19 public class IPUtils {
20
21     /**
22      * 初始化 SEARCHER
23      */
24     @SuppressWarnings("InstantiationOfUtilityClass")
25     private final static IPUtils INSTANCE = new IPUtils();
26
27     /**
28      * IP 查询器,启动加载到内存中
29      */
30     private static Searcher SEARCHER;
31
32     /**
33      * 私有化构造
34      */
35     private IPUtils() {
36         try {
37             long now = System.currentTimeMillis();
38             byte[] bytes = ResourceUtil.readBytes("ip2region.xdb");
39             SEARCHER = Searcher.newWithBuffer(bytes);
40             log.info("启动加载 IPUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now);
41         } catch (IOException e) {
42             log.error("启动加载 IPUtils 失败", e);
43         }
44     }
45
46     /**
47      * 查询 IP 对应的地区编号
48      *
49      * @param ip IP 地址,格式为 127.0.0.1
50      * @return 地区id
51      */
52     @SneakyThrows
53     public static Integer getAreaId(String ip) {
54         return Integer.parseInt(SEARCHER.search(ip.trim()));
55     }
56
57     /**
58      * 查询 IP 对应的地区编号
59      *
60      * @param ip IP 地址的时间戳,格式参考{@link Searcher#checkIP(String)} 的返回
61      * @return 地区编号
62      */
63     @SneakyThrows
64     public static Integer getAreaId(long ip) {
65         return Integer.parseInt(SEARCHER.search(ip));
66     }
67
68     /**
69      * 查询 IP 对应的地区
70      *
71      * @param ip IP 地址,格式为 127.0.0.1
72      * @return 地区
73      */
74     public static Area getArea(String ip) {
75         return AreaUtils.getArea(getAreaId(ip));
76     }
77
78     /**
79      * 查询 IP 对应的地区
80      *
81      * @param ip IP 地址的时间戳,格式参考{@link Searcher#checkIP(String)} 的返回
82      * @return 地区
83      */
84     public static Area getArea(long ip) {
85         return AreaUtils.getArea(getAreaId(ip));
86     }
87 }