package jnpf.util; import lombok.extern.slf4j.Slf4j; import org.lionsoul.ip2region.xdb.Searcher; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.util.FileCopyUtils; /** * IP归属地离线转换 * 基于Ip2region项目 * 需要将地址数据库ip2region.xdb放在项目资源目录下的指定位置 /ip2region/ip2region.xdb * * @author JNPF开发平台组 * @version V5.0.0 * @copyright 引迈信息技术有限公司 * @date 2025/3/25 10:00 */ @Slf4j public class Ip2RegionUtil { private static String ipregionFormatStr = "%s%s%s %s"; private static ResourceLoader resourceLoader = new DefaultResourceLoader(); private static String ip2regionFile = "/ip2region/ip2region.xdb"; private static Searcher searcher; static { loadData(); } private static void loadData(){ try { Resource resource = resourceLoader.getResource(ip2regionFile); searcher = Searcher.newWithBuffer(FileCopyUtils.copyToByteArray(resource.getInputStream())); } catch (Exception e) { log.error("加载IP数据库[{}]失败:{}", ip2regionFile, e.getMessage()); } } /** * 获取IP地址信息 * * @param ip * @return 中国|0|河北省|保定市|联通 */ public static String getIpRegion(String ip) { if(searcher != null && ip != null) { try { return searcher.search(ip); } catch (Exception e) { if (log.isInfoEnabled()) { log.info("解析IP出错: {}, {}", ip, e.getMessage()); } } } return null; } /** * 获取IP格式化后的地址信息 * @param ip * @return 河北省保定市 联通 */ public static String getIp2RegionStr(String ip) { String region = getIpRegion(ip); if(region != null) { region = region.replaceAll("0", " "); String[] iparr = region.split("[|]"); if(iparr.length == 5) { String country = ""; // 国内地址节省长度不加中国前缀 if(!"中国".equals(iparr[0])){ if("内网IP".equals(iparr[3])){ return "内网IP"; } country = iparr[0]; } return String.format(ipregionFormatStr, country.trim(), iparr[2].trim(), iparr[3].trim(), iparr[4].trim()); }else { region = region.replaceAll("[|]", ""); } } return region; } /*public static void main(String[] args) { ip2regionFile = "file:///D:/Projects/IdeaProjects/jnpf-java-boot-tmp/jnpf-admin/src/main/resources/ip2region/ip2region.xdb"; loadData(); System.out.println(getIp2RegionStr("110.242.69.21")); System.out.println(getIp2RegionStr("183.2.172.177")); System.out.println(getIp2RegionStr("220.181.111.1")); System.out.println(getIp2RegionStr("180.101.49.44")); System.out.println(getIp2RegionStr("110.242.70.57")); System.out.println(getIp2RegionStr("103.235.46.115")); System.out.println(getIp2RegionStr("119.63.197.151")); System.out.println(getIp2RegionStr("103.235.46.115")); System.out.println(getIp2RegionStr("45.113.192.101")); System.out.println(getIp2RegionStr("103.235.46.102")); System.out.println(getIp2RegionStr("119.63.197.151")); System.out.println(getIp2RegionStr("104.16.123.96")); System.out.println(getIp2RegionStr("192.168.20.133")); System.out.println(getIp2RegionStr("127.0.0.1")); }*/ }