1.依赖
<dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>2.7.0</version> </dependency>
2.加入ip2region.xdb文件
3.加入到项目里面去
把 ip2region.xdb 文件放到 resources 文件夹里面的去
在Maven里面添加依赖,防止把这个xdb文件编译:
<plugin> <artifactId>maven-resources-plugin</artifactId> <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>xdb</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin>
4.工具类
package com.example.demo.util; import lombok.extern.slf4j.Slf4j; import org.lionsoul.ip2region.xdb.Searcher; import org.springframework.core.io.ClassPathResource; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * ip解析工具 * * @author zzt * @version v1.0.0 * @date 2023/6/9 9:26 */ @Slf4j public class IpParseUtil { /** * 将整个xdb文件加载到内存中(11M左右),此种创建方式支持多线程,因此只需要加载一次 */ private final static Searcher SEARCHER; static { try { ClassPathResource resource = new ClassPathResource("ip2region.xdb"); //获取真实文件路径 String path = resource.getURL().getPath(); byte[] cBuff = Searcher.loadContentFromFile(path); SEARCHER = Searcher.newWithBuffer(cBuff); log.info("加载了ip2region.xdb文件,Searcher初始化完成!"); } catch (Exception e) { log.error("初始化ip2region.xdb文件失败,报错信息:[{}]", e.getMessage(), e); throw new RuntimeException("系统异常!"); } } /** * 解析ip地址 * * @param ipStr 字符串类型ip 例:192.168.0.1 * @return 返回结果形式(国家|区域|省份|城市|ISP) 例 [中国, 0, 河北省, 衡水市, 电信] */ public static List<String> parse(String ipStr) { return parse(ipStr, null); } /** * 自定义解析ip地址 * * @param ipStr ip 字符串类型ip 例:1970753539(经过转换后的) * @param index 想要获取的区间 例如:只想获取 省,市 index = [2,3] * @return 返回结果例 [北京,北京市] */ public static List<String> parse(String ipStr, int[] index) { try { long ip = Searcher.checkIP(ipStr); return parse(ip, index); } catch (Exception e) { log.error("ip解析为long错误,ipStr:[{}],错误信息:[{}]", ipStr, e.getMessage(), e); throw new RuntimeException("系统异常!"); } } /** * 自定义解析ip地址 * * @param ip ip Long类型ip * @param index 想要获取的区间 例如:只想获取 省,市 index = [2,3] * @return 返回结果例 [河北省, 衡水市] */ public static List<String> parse(Long ip, int[] index) { //获取xdb文件资源 List<String> regionList = new ArrayList<>(); try { String region = SEARCHER.search(ip); String[] split = region.split("\\|"); if (index == null) { regionList = Arrays.asList(split); } else { for (int i : index) { regionList.add(split[i]); } } //关闭资源 SEARCHER.close(); } catch (Exception e) { log.error("根据ip解析地址失败,ip:[{}],index[{}],报错信息:[{}]", ip, index, e.getMessage(), e); throw new RuntimeException("系统异常!"); } return regionList; } /** * 获取IP方法 * * @author ruoyi */ public static String getIpAddr(HttpServletRequest request) { if (request == null) { return "unknown"; } String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Forwarded-For"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } public static void main(String[] args) { String ip = "112.96.63.11"; List<String> parse = parse(ip); System.out.println(parse); } }
执行main方法:
结果:
5. 注意事项:
1.部署到线上之后:出现java文件操作报错:java.io.FileNotFoundException
解决方法:【已解决】在linux部署出现java文件操作报错:java.io.FileNotFoundException-CSDN博客