From 5fb2890167e109f24dd3a9e3a7c412e2e0684d7c Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Thu, 11 Dec 2025 19:57:27 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=A2=9E=E5=8A=A0=E5=AF=B9IPv6?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E5=BA=93=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96Ip2Region=E5=88=9D=E5=A7=8B=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/ip/RegionUtils.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java index a2d210c10..a4a377298 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java @@ -10,6 +10,7 @@ import org.lionsoul.ip2region.service.Ip2Region; import org.lionsoul.ip2region.xdb.Util; import java.io.File; +import java.net.URL; import java.time.Duration; /** @@ -33,7 +34,6 @@ public class RegionUtils { // 未知地址 public static final String UNKNOWN_ADDRESS = "未知"; - // Ip2Region服务实例 private static Ip2Region ip2Region; @@ -42,36 +42,42 @@ public class RegionUtils { try { // 创建临时文件用于处理IP离线数据库xdb文件 File v4TempXdb = FileUtil.writeFromStream(ResourceUtil.getStream(DEFAULT_IPV4_XDB_PATH), FileUtil.createTempFile()); -// File v6TempXdb = FileUtil.writeFromStream(ResourceUtil.getStream(DEFAULT_IPV6_XDB_PATH), FileUtil.createTempFile()); // IPv4配置 Config v4Config = Config.custom() .setCachePolicy(Config.BufferCache) .setXdbPath(v4TempXdb.getPath()) .asV4(); - // IPv6配置 -// Config v6Config = Config.custom() -// .setCachePolicy(Config.BufferCache) -// .setXdbPath(v6TempXdb.getPath()) -// .asV6(); - - // 初始化Ip2Region实例 - RegionUtils.ip2Region = Ip2Region.create(v4Config, null); -// RegionUtils.ip2Region = Ip2Region.create(v4Config, v6Config); - // 删除临时文件 // 注意:因为使用的 CachePolicy 为 BufferCache,BufferCache是加载整个xdb文件到内存中,所以临时文件的删除不会影响到正常的使用。如果使用的是 VIndexCache 或 NoCache(即实时读取文件),删除临时文件会导致xdb数据库读取不到而无法使用。 // CachePolicy的三种策略:BufferCache(全量读取xdb到内存中)、VIndexCache(按需读取并缓存)、NoCache(实时读取) // 一般而言,更建议把xdb数据库放到一个指定的文件目录中(即不打包进jar包中),然后使用 NoCache + 配合SearcherPool的并发池读取数据,更方便随时更新xdb数据库 v4TempXdb.delete(); -// v6TempXdb.delete(); + + // IPv6配置 + Config v6Config = null; + URL v6Url = ResourceUtil.getResource(DEFAULT_IPV6_XDB_PATH); + if (v6Url == null) { + log.info("未加载 IPv6 地址库:未在类路径下找到文件 {}。当前仅启用 IPv4 查询。如需启用 IPv6,请将 ip2region_v6.xdb 放置到 resources 目录(与 {} 同级)。", + DEFAULT_IPV6_XDB_PATH, DEFAULT_IPV4_XDB_PATH); + } else { + File v6TempXdb = FileUtil.writeFromStream(v6Url.openStream(), FileUtil.createTempFile()); + v6Config = Config.custom() + .setCachePolicy(Config.BufferCache) + .setXdbPath(v6TempXdb.getPath()) + .asV6(); + // 删除临时文件 + v6TempXdb.delete(); + } + + // 初始化Ip2Region实例 + RegionUtils.ip2Region = Ip2Region.create(v4Config, v6Config); log.info("Ip2RegionHelper初始化成功,加载IP地址库数据成功!"); - } catch (Exception e) { + } catch (Exception e) { throw new ServiceException("Ip2RegionHelper初始化失败,原因:{}", e.getMessage()); } } - /** * 根据IP地址离线获取城市 *