From 9dd57179da364e1b00e59127e04f023445e7833f Mon Sep 17 00:00:00 2001 From: 疯狂的狮子li <15040126243@163.com> Date: 星期三, 15 三月 2023 18:21:25 +0800 Subject: [PATCH] add 新增 ip2region 实现离线IP地址定位库 --- ruoyi-common/ruoyi-common-core/src/main/resources/ip2region.xdb | 0 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/AddressUtils.java | 31 +-------------- pom.xml | 9 ++++ ruoyi-common/ruoyi-common-core/pom.xml | 6 +++ ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/RegionUtils.java | 70 +++++++++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 29 deletions(-) diff --git a/pom.xml b/pom.xml index d5e3f80..a070256 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,8 @@ <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version> <lombok.version>1.18.26</lombok.version> <bouncycastle.version>1.72</bouncycastle.version> + <!-- 绂荤嚎IP鍦板潃瀹氫綅搴� --> + <ip2region.version>2.7.0</ip2region.version> <!-- 涓存椂淇 snakeyaml 婕忔礊 --> <snakeyaml.version>1.33</snakeyaml.version> @@ -302,6 +304,13 @@ <version>${mapstruct-plus.version}</version> </dependency> + <!-- 绂荤嚎IP鍦板潃瀹氫綅搴� ip2region --> + <dependency> + <groupId>org.lionsoul</groupId> + <artifactId>ip2region</artifactId> + <version>${ip2region.version}</version> + </dependency> + <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-system</artifactId> diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index 5bcc7d9..601afd2 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -90,6 +90,12 @@ <artifactId>mapstruct-plus-spring-boot-starter</artifactId> </dependency> + <!-- 绂荤嚎IP鍦板潃瀹氫綅搴� --> + <dependency> + <groupId>org.lionsoul</groupId> + <artifactId>ip2region</artifactId> + </dependency> + </dependencies> </project> diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/AddressUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/AddressUtils.java index 8fcb3b8..ffef66f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/AddressUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/AddressUtils.java @@ -2,11 +2,6 @@ import cn.hutool.core.net.NetUtil; import cn.hutool.http.HtmlUtil; -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.ruoyi.common.core.config.RuoYiConfig; -import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.utils.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -21,40 +16,18 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AddressUtils { - // IP鍦板潃鏌ヨ - public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; - // 鏈煡鍦板潃 public static final String UNKNOWN = "XX XX"; public static String getRealAddressByIP(String ip) { - String address = UNKNOWN; if (StringUtils.isBlank(ip)) { - return address; + return UNKNOWN; } // 鍐呯綉涓嶆煡璇� ip = "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); if (NetUtil.isInnerIP(ip)) { return "鍐呯綉IP"; } - if (RuoYiConfig.isAddressEnabled()) { - try { - String rspStr = HttpUtil.createGet(IP_URL) - .body("ip=" + ip + "&json=true", Constants.GBK) - .execute() - .body(); - if (StringUtils.isEmpty(rspStr)) { - log.error("鑾峰彇鍦扮悊浣嶇疆寮傚父 {}", ip); - return UNKNOWN; - } - JSONObject obj = JSONUtil.parseObj(rspStr); - String region = obj.getStr("pro"); - String city = obj.getStr("city"); - return String.format("%s %s", region, city); - } catch (Exception e) { - log.error("鑾峰彇鍦扮悊浣嶇疆寮傚父 {}", ip); - } - } - return UNKNOWN; + return RegionUtils.getCityInfo(ip); } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/RegionUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/RegionUtils.java new file mode 100644 index 0000000..9b00aa1 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/RegionUtils.java @@ -0,0 +1,70 @@ +package com.ruoyi.common.core.utils.ip; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.utils.file.FileUtils; +import lombok.extern.slf4j.Slf4j; +import org.lionsoul.ip2region.xdb.Searcher; + +import java.io.File; + +/** + * 鏍规嵁ip鍦板潃瀹氫綅宸ュ叿绫伙紝绂荤嚎鏂瑰紡 + * 鍙傝�冨湴鍧�锛�<a href="https://gitee.com/lionsoul/ip2region/tree/master/binding/java">闆嗘垚 ip2region 瀹炵幇绂荤嚎IP鍦板潃瀹氫綅搴�</a> + * + * @author lishuyan + */ +@Slf4j +public class RegionUtils { + + private static final Searcher SEARCHER; + + static { + String fileName = "/ip2region.xdb"; + File existFile = FileUtils.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName); + if (!FileUtils.exist(existFile)) { + ClassPathResource fileStream = new ClassPathResource(fileName); + if (ObjectUtil.isEmpty(fileStream.getStream())) { + throw new ServiceException("RegionUtils鍒濆鍖栧け璐ワ紝鍘熷洜锛欼P鍦板潃搴撴暟鎹笉瀛樺湪锛�"); + } + FileUtils.writeFromStream(fileStream.getStream(), existFile); + } + + String dbPath = existFile.getPath(); + + // 1銆佷粠 dbPath 鍔犺浇鏁翠釜 xdb 鍒板唴瀛樸�� + byte[] cBuff; + try { + cBuff = Searcher.loadContentFromFile(dbPath); + } catch (Exception e) { + throw new ServiceException("RegionUtils鍒濆鍖栧け璐ワ紝鍘熷洜锛氫粠ip2region.xdb鏂囦欢鍔犺浇鍐呭澶辫触锛�" + e.getMessage()); + } + // 2銆佷娇鐢ㄤ笂杩扮殑 cBuff 鍒涘缓涓�涓畬鍏ㄥ熀浜庡唴瀛樼殑鏌ヨ瀵硅薄銆� + try { + SEARCHER = Searcher.newWithBuffer(cBuff); + } catch (Exception e) { + throw new ServiceException("RegionUtils鍒濆鍖栧け璐ワ紝鍘熷洜锛�" + e.getMessage()); + } + } + + /** + * 鏍规嵁IP鍦板潃绂荤嚎鑾峰彇鍩庡競 + */ + public static String getCityInfo(String ip) { + try { + ip = ip.trim(); + // 3銆佹墽琛屾煡璇� + String region = SEARCHER.search(ip); + return region.replace("0|", "").replace("|0", ""); + } catch (Exception e) { + log.error("IP鍦板潃绂荤嚎鑾峰彇鍩庡競寮傚父 {}", ip); + return "鏈煡"; + } + } + + public static void main(String[] args){ + System.out.println(RegionUtils.getCityInfo("175.169.65.25")); + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/resources/ip2region.xdb b/ruoyi-common/ruoyi-common-core/src/main/resources/ip2region.xdb new file mode 100644 index 0000000..31f96a1 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/resources/ip2region.xdb Binary files differ -- Gitblit v1.9.3