Springboot中基于 IP 地址的请求速率限制拦截器

embedded/2024/10/22 3:43:29/

       基于 IP 地址的请求速率限制拦截器,使用了 Bucket4j 库来管理请求的令牌桶。下面是对代码的详细解释,以及如何在触发请求拒绝时将 IP 地址加入黑名单的实现。  

      导入依赖

        <dependency><groupId>com.github.vladimir-bukhtoyarov</groupId><artifactId>bucket4j-core</artifactId><version>6.0.2</version></dependency>

      RateLimitInterceptor拦截器类

import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Bucket;
import io.github.bucket4j.Bucket4j;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.Duration;
import java.util.concurrent.ConcurrentHashMap;@Slf4j
public class RateLimitInterceptor implements HandlerInterceptor {private final Bandwidth limit = Bandwidth.simple(100, Duration.ofMinutes(1));private final ConcurrentHashMap<String, Bucket> buckets = new ConcurrentHashMap<>();@Autowiredprivate RedisTemplate<String, String> redisTemplate; // Redis 模板@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String ip = request.getRemoteAddr();log.info("当前访问ip: {}", ip);// 检查 IP 是否在黑名单中if (isBlacklisted(ip)) {response.setStatus(403); // 返回 403 状态码,表示禁止访问return false; // 拒绝请求}Bucket bucket = buckets.computeIfAbsent(ip, key -> Bucket4j.builder().addLimit(limit).build());if (bucket.tryConsume(1)) {return true; // 允许请求} else {// 将 IP 加入黑名单blacklistIp(ip);response.setStatus(429); // 返回 429 状态码return false; // 拒绝请求}}private boolean isBlacklisted(String ip) {// 检查 Redis 中是否存在该 IPreturn redisTemplate.hasKey("blacklist:" + ip);}private void blacklistIp(String ip) {// 将 IP 加入黑名单,设置过期时间为 1 小时redisTemplate.opsForValue().set("blacklist:" + ip, "true", Duration.ofHours(1));}
}

导入依赖:
Bucket4j:用于实现令牌桶算法的库。
HandlerInterceptor:Spring MVC 的拦截器接口,用于在请求处理之前和之后执行一些操作。
ConcurrentHashMap:用于存储每个 IP 地址对应的令牌桶,支持并发访问。
类定义:
RateLimitInterceptor 类实现了 HandlerInterceptor 接口。
带宽定义:
limit:定义了一个带宽限制,设置为每分钟允许 100 次请求。
桶存储:
buckets:使用 ConcurrentHashMap 存储每个 IP 地址对应的令牌桶。
请求处理:
preHandle 方法在请求处理之前被调用。
获取请求的 IP 地址。
使用 computeIfAbsent 方法获取或创建对应 IP 的桶。
尝试消耗一个令牌,如果成功,则允许请求继续;如果失败,则返回 429 状态码,表示请求过多。

RedisTemplate:

使用 RedisTemplate 来与 Redis 进行交互,检查和存储黑名单。
黑名单检查:

在 preHandle 方法中,首先检查请求的 IP 是否在黑名单中。如果在黑名单中,返回 403 状态码,拒绝请求。
黑名单添加:

如果请求被拒绝(即超过速率限制),调用 blacklistIp 方法将该 IP 加入黑名单,并设置过期时间为 1 小时。
黑名单检查方法:

isBlacklisted 方法用于检查 IP 是否在黑名单中。
通过这些修改,您可以有效地管理请求速率,并在触发拒绝请求时将 IP 地址加入黑名单,从而防止恶意请求。

web配置文件中注册拦截器

	/*** 注册拦截器* @Param [registry]*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册jwt拦截器registry.addInterceptor(new JWTInterceptor()).excludePathPatterns("/user/register", "/user/login", "/user/info", "/user/logout", ).//请求放行addPathPatterns("/**");// 注册速率限制拦截器registry.addInterceptor(new RateLimitInterceptor());}


http://www.ppmy.cn/embedded/129456.html

相关文章

FFmpeg 怎样根据图片和文本生成视频

使用FFmpeg根据图片和文本生成视频&#xff0c;你可以使用image2过滤器来处理图片&#xff0c;并使用subtitles过滤器来添加文本。以下是一个基本的命令行示例&#xff0c;它将图片转换为视频&#xff0c;并将文本作为字幕叠加&#xff1a; ffmpeg -loop 1 -i image.jpg -vf &…

软件架构之构件复用技术

简介 软件架构复用 在应用软件系统的开发过程中&#xff0c;通常包含以下几个关键阶段&#xff1a;需求分析、设计、编码、测试和维护。在这些阶段中&#xff0c;复用技术均可以得到有效应用。特别是&#xff0c;软件架构复用作为一种大粒度、高抽象级别的复用方式&#xff0…

前端开发实践与后端开发解耦(一)-- 接口数据mock和接口字段映射

摘要 众所周知&#xff0c;现在的前后端开发都是独立的&#xff0c;除了一些老项目。但是如果公司的开发流程不规范就可能出现前端开发的阻塞&#xff0c;或者出现得多做一些无用功。正确的开发流程应该是&#xff1a;需求评审–需求确认–后端接口设计并输出文档 – 前/后端开…

STMicroelectronics 意法半导体芯片选型表

意法半导体作为全球知名的半导体厂商&#xff0c;其产品广泛应用于各个领域&#xff0c;从消费电子到工业控制&#xff0c;从汽车电子到通信设备&#xff0c;都能看到意法半导体芯片的身影。在电子硬件设计领域&#xff0c;芯片的选型至关重要。亿配芯城&#xff08;ICgoodFind…

【SpringCloud】03-Gateway网关

1. Gateway 网关&#xff1a;负责请求的路由、转发、身份校验。 2. Spring Cloud Gateway 依赖 <!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></de…

基于jsp+Spring boot+mybatis的图书管理系统设计和实现

基于jspSpring bootmybatis的图书管理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …

5G NR Test UE FR1

什么是5G NR Test UE FR1套件&#xff1f; 5G NR Test UE FR1套件完全符合3GPP Release 15标准&#xff0c;用于模拟5G用户设备(UE)&#xff0c;并可在连接到gNodeB时提供实时性能信息。凭借100 MHz的带宽和4x2 MIMO&#xff0c;该套件可以在每个5G频段上测试组件、子系统和/或…

基于微信小程序二手物品调剂系统设计与实现

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图文章目录 前言 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 二手物品调剂系统是一种在线平台&#xff0c;旨在促进用户之间的二手物品交易。该系统提供了一个…