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