SpringBoot如何限制请求访问次数

在Spring Boot应用中限制请求访问次数可以通过几种不同的方法实现,如使用Rate Limiting中间件或自定义拦截器。以下是一些常见的实现方法:

方法1:使用Spring Boot内置的Rate Limiting工具

1.1 使用Bucket4j

Bucket4j是一个Java库,可以用来实现令牌桶算法的Rate Limiting。你可以通过以下步骤来集成Bucket4j:

步骤1:添加依赖

pom.xml中添加Bucket4j的依赖:

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

步骤2:创建配置类

创建一个Spring配置类来配置Rate Limiting:

import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Bucket;
import io.github.bucket4j.Bucket4j;
import io.github.bucket4j.Refill;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.time.Duration;@Configuration
public class RateLimiterConfig {@Beanpublic Bucket bucket() {Bandwidth limit = Bandwidth.classic(10, Refill.greedy(10, Duration.ofMinutes(1)));return Bucket4j.builder().addLimit(limit).build();}
}

步骤3:创建过滤器

创建一个过滤器来应用Rate Limiting:

import io.github.bucket4j.Bucket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@Component
public class RateLimitFilter implements Filter {@Autowiredprivate Bucket bucket;@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {if (bucket.tryConsume(1)) {chain.doFilter(request, response);} else {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());httpResponse.getWriter().write("Too many requests");}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}

步骤4:注册过滤器

application.propertiesapplication.yml中配置过滤器:

spring:web:filter:order: 1

方法2:使用Spring AOP实现Rate Limiting

通过Spring AOP(Aspect-Oriented Programming)也可以实现请求限制。

步骤1:创建自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {int value();
}

步骤2:创建切面类

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;@Aspect
@Component
public class RateLimitAspect {private ConcurrentHashMap<String, Long> requestCounts = new ConcurrentHashMap<>();@Around("@annotation(rateLimit)")public Object rateLimit(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {String key = joinPoint.getSignature().toShortString();requestCounts.putIfAbsent(key, 0L);long requests = requestCounts.get(key);if (requests >= rateLimit.value()) {throw new RuntimeException("Too many requests");} else {requestCounts.put(key, requests + 1);TimeUnit.MINUTES.sleep(1); // Reset the counter every minutereturn joinPoint.proceed();}}
}

步骤3:在需要限制的控制器方法上使用注解

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
public class MyController {@RateLimit(10)@GetMapping("/resource")public String getResource() {return "This is a rate-limited resource";}
}

这两种方法都可以有效地限制Spring Boot应用中的请求访问次数。第一种方法使用Bucket4j库实现了令牌桶算法,第二种方法通过Spring AOP实现了自定义的Rate Limiting逻辑。可以根据你的具体需求选择合适的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab实现绘制矢量图

在MATLAB中绘制矢量图&#xff08;Vector Field&#xff09;主要涉及到使用箭头来表示向量的大小和方向。这可以通过quiver函数&#xff08;注意&#xff1a;MATLAB的官方函数是quiver&#xff0c;但请注意它可能是quiver3的误写&#xff0c;因为quiver3用于三维矢量场&#xf…

ArcGIS Pro SDK (九)几何 6 包络

ArcGIS Pro SDK &#xff08;九&#xff09;几何 6 包络 文章目录 ArcGIS Pro SDK &#xff08;九&#xff09;几何 6 包络1 构造包络2 构造包络 - 从 JSON 字符串3 合并两个包络4 与两个包络相交5 展开包络6 更新包络的坐标 环境&#xff1a;Visual Studio 2022 .NET6 ArcGI…

加油卡APP系统开发:在线优惠加油,拓展市场

目前&#xff0c;我国汽车行业发展迅速&#xff0c;用车群体逐年扩大&#xff0c;因此&#xff0c;汽车加油市场规模呈现出了快速增长趋势。不过近年来&#xff0c;油价不断上涨&#xff0c;增加了居民的生活成本&#xff0c;为了节省汽车加油的支出&#xff0c;很多人都开始选…

使用idea创建Javaweb项目(步骤)

第一步创建Javaweb项目 File>New>Project 第二步 勾选Web Application >Next 然后就是进行起名&#xff0c;完成。 完成创建项目&#xff0c;检查是否文件齐全 配置tomcat 配置好&#xff0c;就能启动tomcat&#xff0c;显示首页 导入jar包。导入进项目&#xf…

【力扣】最小栈

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 设计一个支持 push…

数仓工具—Hive语法之替换函数和示例

Hive 替换函数和示例 默认情况下,并没有可用的 Hive 替换函数。如果在处理字符串时需要替换特定值,例如垃圾值,字符串操作函数替换是非常需要的。在本文中,我们将检查 Hive 替换函数 的替代方法,以便在需要时使用。 如前所述,Apache Hive 不提供替换函数的支持。但是,…

信息系统是一个社会技术系统

一.管理信息系统定义 (1) 技术视角 信息系统是&#xff1a; ——由若干相互连接的部件组成的&#xff1b; ——对组织中的信息进行收集、处理、储存和传递的系统&#xff1b; ——用以支持组织制定决策和管理控制&#xff1b; ——还可以协助管理者与员工分析问题、可视…

PLC中的高低字节如何理解?

双字&#xff08;Double Word&#xff0c;通常是32位整数&#xff09;的高低字节定义可能会因具体的PLC型号和通信协议而有所不同。通常&#xff0c;双字可以被划分为两个16位字&#xff0c;每个16位字又分为高字节和低字节。 以下是一般定义&#xff1a; 双字&#xff08;32…

【异常解决】Unable to start embedded Tomcat Nacos 启动报错

Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos&#xff08;2.2.0&#xff09; 服务&#xff0c;控制台报错 Unable to start embedded Tomcat。 报错信息&#xff1a;Unable to start …

《JavaScript语言精粹》学习笔记——数组

JavaScript中并没有像数组一样的数据结构。而是提供了一种拥有一些类数组特性的对象。 数组字面量 var numbers[one,two,three,four,izero,seven,eight]//对象字面量 var numbers object{1:"one",2:"two" };numbers继承自Array.prototype&#xff0c;而n…

HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(六)

一、仅支持一个静态块 规则&#xff1a;arkts-no-multiple-static-blocks 级别&#xff1a;错误 ArkTS不允许类中有多个静态块&#xff0c;如果存在多个静态块语句&#xff0c;请合并到一个静态块中。 TypeScript class C {static s: stringstatic {C.s aa}static {C.s C.s …

nginx负载均衡实例

实现效果 浏览器输入地址http://nginx服务器ip(:80)/edu/a.html&#xff0c;实现负债均衡效果&#xff0c;平均分配到 服务器ip:8080和 服务器ip:8081进程中。 准备工作 准备两个tomcat&#xff0c;一个监听在8080端口&#xff0c;一个监听在8081端口。也可以准备多个tomcat。…

数据结构小测试:排序算法

目录 1、请简述数据结构八大排序算法的思路。 2、常用排序算法手写 冒泡排序&#xff1a; 选择排序&#xff1a; 快速排序&#xff1a; 归并排序&#xff1a; 堆排序&#xff1a; 3、额外再加一个二分查找吧 1、请简述数据结构八大排序算法的思路。 冒泡排序&#xff…

c# DI构造函数注入

构造函数注入&#xff08;Constructor Injection&#xff09;是依赖注入&#xff08;DI&#xff09;的一种形式&#xff0c;是指通过类的构造函数将依赖项&#xff08;通常是其他类或接口的实例&#xff09;传递给类的实例。 这种方式可以让类在实例化时就具备所需的依赖项&am…

Linux——多路复用之select

目录 前言 一、select的认识 二、select的接口 三、select的使用 四、select的优缺点 前言 在前面&#xff0c;我们学习了五种IO模型&#xff0c;对IO有了基本的认识&#xff0c;知道了select效率很高&#xff0c;可以等待多个文件描述符&#xff0c;那他是如何等待的呢&a…

Dubbo 的泛化调用

在分布式系统中&#xff0c;有时我们需要调用一些未知的服务接口&#xff0c;这些接口可能在编译时并不存在&#xff0c;或者由于版本问题而发生变化。为了应对这种情况&#xff0c;Apache Dubbo 提供了泛化调用&#xff08;Generic Invocation&#xff09;功能&#xff0c;使得…

易保全参与起草的两项区块链全国团体标准正式发布

在数字化转型浪潮席卷全球的今天&#xff0c;区块链技术以其去中心化、透明性、不可篡改等独特优势&#xff0c;正逐步成为重塑各行各业信任机制与业务流程的关键力量。 近日&#xff0c;中国通信工业协会正式发布了《区块链服务 基于区块链的去中心化标识符技术要求》与《区块…

python--实验14 并发编程(多线程)

知识点 1 并发编程 1.1程序提速手段 1.2多任务 并发 在一个CPU一段时间内交替去执行任务。在各个任务之间快速地切换&#xff0c;给人的感觉就是多个任务在“同时进行”。 并行 对于多核CPU处理多任务&#xff0c;操作系统会给CPU的每个内核安排一个执行的软件&#xff0c;多…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

【笔记-软考】软件架构风格

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-18 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 概念 架构风格是描述某一特定应用领域中系统组织方式的惯用模式&#xff0c;其反映了领域中众多系统所共有的结构和语义特性&#x…