Ip2RegionUtil.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package jnpf.util;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.lionsoul.ip2region.xdb.Searcher;
  4. import org.springframework.core.io.DefaultResourceLoader;
  5. import org.springframework.core.io.Resource;
  6. import org.springframework.core.io.ResourceLoader;
  7. import org.springframework.util.FileCopyUtils;
  8. /**
  9. * IP归属地离线转换
  10. * 基于Ip2region项目
  11. * 需要将地址数据库ip2region.xdb放在项目资源目录下的指定位置 /ip2region/ip2region.xdb
  12. *
  13. * @author JNPF开发平台组
  14. * @version V5.0.0
  15. * @copyright 引迈信息技术有限公司
  16. * @date 2025/3/25 10:00
  17. */
  18. @Slf4j
  19. public class Ip2RegionUtil {
  20. private static String ipregionFormatStr = "%s%s%s %s";
  21. private static ResourceLoader resourceLoader = new DefaultResourceLoader();
  22. private static String ip2regionFile = "/ip2region/ip2region.xdb";
  23. private static Searcher searcher;
  24. static {
  25. loadData();
  26. }
  27. private static void loadData(){
  28. try {
  29. Resource resource = resourceLoader.getResource(ip2regionFile);
  30. searcher = Searcher.newWithBuffer(FileCopyUtils.copyToByteArray(resource.getInputStream()));
  31. } catch (Exception e) {
  32. log.error("加载IP数据库[{}]失败:{}", ip2regionFile, e.getMessage());
  33. }
  34. }
  35. /**
  36. * 获取IP地址信息
  37. *
  38. * @param ip
  39. * @return 中国|0|河北省|保定市|联通
  40. */
  41. public static String getIpRegion(String ip) {
  42. if(searcher != null && ip != null) {
  43. try {
  44. return searcher.search(ip);
  45. } catch (Exception e) {
  46. if (log.isInfoEnabled()) {
  47. log.info("解析IP出错: {}, {}", ip, e.getMessage());
  48. }
  49. }
  50. }
  51. return null;
  52. }
  53. /**
  54. * 获取IP格式化后的地址信息
  55. * @param ip
  56. * @return 河北省保定市 联通
  57. */
  58. public static String getIp2RegionStr(String ip) {
  59. String region = getIpRegion(ip);
  60. if(region != null) {
  61. region = region.replaceAll("0", " ");
  62. String[] iparr = region.split("[|]");
  63. if(iparr.length == 5) {
  64. String country = "";
  65. // 国内地址节省长度不加中国前缀
  66. if(!"中国".equals(iparr[0])){
  67. if("内网IP".equals(iparr[3])){
  68. return "内网IP";
  69. }
  70. country = iparr[0];
  71. }
  72. return String.format(ipregionFormatStr, country.trim(), iparr[2].trim(), iparr[3].trim(), iparr[4].trim());
  73. }else {
  74. region = region.replaceAll("[|]", "");
  75. }
  76. }
  77. return region;
  78. }
  79. /*public static void main(String[] args) {
  80. ip2regionFile = "file:///D:/Projects/IdeaProjects/jnpf-java-boot-tmp/jnpf-admin/src/main/resources/ip2region/ip2region.xdb";
  81. loadData();
  82. System.out.println(getIp2RegionStr("110.242.69.21"));
  83. System.out.println(getIp2RegionStr("183.2.172.177"));
  84. System.out.println(getIp2RegionStr("220.181.111.1"));
  85. System.out.println(getIp2RegionStr("180.101.49.44"));
  86. System.out.println(getIp2RegionStr("110.242.70.57"));
  87. System.out.println(getIp2RegionStr("103.235.46.115"));
  88. System.out.println(getIp2RegionStr("119.63.197.151"));
  89. System.out.println(getIp2RegionStr("103.235.46.115"));
  90. System.out.println(getIp2RegionStr("45.113.192.101"));
  91. System.out.println(getIp2RegionStr("103.235.46.102"));
  92. System.out.println(getIp2RegionStr("119.63.197.151"));
  93. System.out.println(getIp2RegionStr("104.16.123.96"));
  94. System.out.println(getIp2RegionStr("192.168.20.133"));
  95. System.out.println(getIp2RegionStr("127.0.0.1"));
  96. }*/
  97. }