51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

使用 Spring Boot 与 ip2region 联手打造高效 IP 白名单,性能爆表!

使用 Spring Boot 与 ip2region 联手打造高效 IP 白名单,性能爆表!

在当今互联网应用的开发中,IP 白名单功能是保障系统安全性和稳定性的重要手段之一。本文将详细介绍如何使用 Spring Boot 框架结合 ip2region 库来打造高效的 IP 白名单功能,并通过详细的代码示例和配置文件进行深入讲解。

ip2region 框架介绍与特性

ip2region 是一个高效的 IP 地址定位库,它具有以下显著特性:

  1. 高性能:能够快速地将 IP 地址转换为对应的地理区域信息,即使在处理大量 IP 数据时也能保持出色的性能。

  2. 数据精准:其数据来源准确可靠,能够提供精确的 IP 地址定位结果,有助于实现精准的区域控制和访问策略。

  3. 轻量级:框架本身占用资源少,易于集成到各种应用中,不会给系统带来过多的负担。

  4. 易于使用:提供了简单直观的接口和方法,方便开发者进行调用和集成。

以下是项目的完整 pom.xml 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>ip-white-list</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>IPWhiteList</name>
    <description>使用 Spring Boot + ip2region 实现的 IP 白名单功能</description>

    <properties>         <java.version>11</java.version>     </properties>

    <dependencies>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>         <dependency>             <groupId>com.alibaba</groupId>             <artifactId>ip2region</artifactId>             <version>2.6.1</version>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-devtools</artifactId>             <optional>true</optional>         </dependency>         <dependency>             <groupId>org.projectlombok</groupId>             <artifactId>lombok</artifactId>             <optional>true</optional>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-test</artifactId>             <scope>test</scope>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-thymeleaf</artifactId>         </dependency>     </dependencies>

    <build>         <plugins>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>         </plugins>     </build> </project>

YAML 属性文件配置(application.yml)

# IP 白名单相关配置
ip-white-list:
  enabled: true
  ips:
    - "127.0.0.1"
    - "192.168.1.100"
  # 其他相关配置项

后端代码实现

Ip2RegionUtil 类用于获取 IP 所在的地区信息:

import com.alibaba.druid.util.StringUtils;
import com.lionsoul.ip2region.xdb.Searcher;

import java.io.IOException; import java.util.concurrent.ConcurrentHashMap;

public class Ip2RegionUtil {

    private static final ConcurrentHashMap<String, Searcher> CACHE = new ConcurrentHashMap<>();

    public static String getRegion(String ip) {         if (StringUtils.isEmpty(ip)) {             return "无效的 IP 地址";         }         String dbPath = "/yourPath/ip2region.xdb"; // 请替换为实际的 xdb 文件路径         Searcher searcher;         try {             if (CACHE.containsKey(dbPath)) {                 searcher = CACHE.get(dbPath);             } else {                 searcher = Searcher.newWithFileOnly(dbPath);                 CACHE.put(dbPath, searcher);             }             return searcher.search(ip);         } catch (IOException e) {             e.printStackTrace();             return "查询失败";         }     } }

合理利用缓存上述代码中的 Ip2RegionUtil 类中使用 ConcurrentHashMapSearcher 对象进行合理利用缓存,减少重复创建对象的开销。

大家可以从以下地址获取 ip2regionxdb 文件(即 String dbPath = "/yourPath/ip2region.xdb"; 中所需的文件路径):https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb,及时更新数据源:关注 ip2region 官方提供的数据更新,及时获取并替换最新的 xdb 文件,以保证数据的准确性。

IpWhiteListService 类用于判断 IP 是否在白名单中:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;

@Service public class IpWhiteListService {

    @Value("${ip-white-list.ips}")     private List<String> whiteListIps;

    public boolean isIpInWhiteList(String ip) {         // 使用 ip2region 获取 IP 所在地区信息         String region = Ip2RegionUtil.getRegion(ip);         // 根据地区或其他规则判断是否在白名单         return whiteListIps.contains(ip) && region.equals("特定地区");     } }

IpWhiteListController 类提供了接口供前端调用:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController public class IpWhiteListController {

    private final IpWhiteListService ipWhiteListService;

    public IpWhiteListController(IpWhiteListService ipWhiteListService) {         this.ipWhiteListService = ipWhiteListService;     }

    @GetMapping("/checkIp")     public boolean checkIp(@RequestParam String ip) {         return ipWhiteListService.isIpInWhiteList(ip);     } }

前端页面实现

使用 Thymeleaf 模板和 JavaScript 实现前端页面:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>IP 白名单检查</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <h2>IP 白名单检查</h2>
    <input type="text" id="ipInput">
    <button onclick="checkIp()">检查</button>
    <div id="result"></div>

    <script>         function checkIp() {             var ip = $("#ipInput").val();             $.ajax({                 url: '/checkIp?ip=' + ip,                 type: 'GET',                 success: function (data) {                     if (data) {                         $("#result").text("IP 在白名单中");                     } else {                         $("#result").text("IP 不在白名单中");                     }                 },                 error: function () {                     $("#result").text("请求出错");                 }             });         }     </script> </body> </html>

总结

本文通过详细的代码示例和配置文件,展示了如何使用 Spring Boot 结合 ip2region 库打造高效的 IP 白名单功能。包括后端的服务类、控制器类以及前端的页面交互,为开发者提供了一个完整且可参考的实现方案。

赞(7)
未经允许不得转载:工具盒子 » 使用 Spring Boot 与 ip2region 联手打造高效 IP 白名单,性能爆表!