RegionUtils.java 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package com.ruoyi.common.utils.ip;
  2. import cn.hutool.core.io.FileUtil;
  3. import cn.hutool.core.io.resource.ClassPathResource;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.ruoyi.common.exception.ServiceException;
  6. import com.ruoyi.common.utils.file.FileUtils;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.lionsoul.ip2region.xdb.Searcher;
  9. import java.io.File;
  10. /**
  11. * 根据ip地址定位工具类,离线方式
  12. * 参考地址:<a href="https://gitee.com/lionsoul/ip2region/tree/master/binding/java">集成 ip2region 实现离线IP地址定位库</a>
  13. *
  14. * @author lishuyan
  15. */
  16. @Slf4j
  17. public class RegionUtils {
  18. private static final Searcher SEARCHER;
  19. static {
  20. String fileName = "/ip2region.xdb";
  21. File existFile = FileUtils.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName);
  22. if (!FileUtils.exist(existFile)) {
  23. ClassPathResource fileStream = new ClassPathResource(fileName);
  24. if (ObjectUtil.isEmpty(fileStream.getStream())) {
  25. throw new ServiceException("RegionUtils初始化失败,原因:IP地址库数据不存在!");
  26. }
  27. FileUtils.writeFromStream(fileStream.getStream(), existFile);
  28. }
  29. String dbPath = existFile.getPath();
  30. // 1、从 dbPath 加载整个 xdb 到内存。
  31. byte[] cBuff;
  32. try {
  33. cBuff = Searcher.loadContentFromFile(dbPath);
  34. } catch (Exception e) {
  35. throw new ServiceException("RegionUtils初始化失败,原因:从ip2region.xdb文件加载内容失败!" + e.getMessage());
  36. }
  37. // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。
  38. try {
  39. SEARCHER = Searcher.newWithBuffer(cBuff);
  40. } catch (Exception e) {
  41. throw new ServiceException("RegionUtils初始化失败,原因:" + e.getMessage());
  42. }
  43. }
  44. /**
  45. * 根据IP地址离线获取城市
  46. */
  47. public static String getCityInfo(String ip) {
  48. try {
  49. ip = ip.trim();
  50. // 3、执行查询
  51. String region = SEARCHER.search(ip);
  52. return region.replace("0|", "").replace("|0", "");
  53. } catch (Exception e) {
  54. log.error("IP地址离线获取城市异常 {}", ip);
  55. return "未知";
  56. }
  57. }
  58. }