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 白名单功能。包括后端的服务类、控制器类以及前端的页面交互,为开发者提供了一个完整且可参考的实现方案。

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