使用 Spring Boot 与 ip2region 联手打造高效 IP 白名单,性能爆表!
在当今互联网应用的开发中,IP 白名单功能是保障系统安全性和稳定性的重要手段之一。本文将详细介绍如何使用 Spring Boot 框架结合 ip2region 库来打造高效的 IP 白名单功能,并通过详细的代码示例和配置文件进行深入讲解。
ip2region 框架介绍与特性
ip2region 是一个高效的 IP 地址定位库,它具有以下显著特性:
-
高性能:能够快速地将 IP 地址转换为对应的地理区域信息,即使在处理大量 IP 数据时也能保持出色的性能。
-
数据精准:其数据来源准确可靠,能够提供精确的 IP 地址定位结果,有助于实现精准的区域控制和访问策略。
-
轻量级:框架本身占用资源少,易于集成到各种应用中,不会给系统带来过多的负担。
-
易于使用:提供了简单直观的接口和方法,方便开发者进行调用和集成。
以下是项目的完整 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
类中使用 ConcurrentHashMap
对 Searcher
对象进行合理利用缓存,减少重复创建对象的开销。
大家可以从以下地址获取 ip2region
的 xdb
文件(即 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 白名单功能。包括后端的服务类、控制器类以及前端的页面交互,为开发者提供了一个完整且可参考的实现方案。