SpringBoot如何在一定时间内限制接口请求次数
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要介绍"SpringBoot如何在一定时间内限制接口请求次数",在日常操作中,相信很多人在SpringBoot如何在一定时间内限制接口请求次数问题上存在疑惑,小编查阅了各式资料,整理出简单好
千家信息网最后更新 2025年11月08日SpringBoot如何在一定时间内限制接口请求次数
这篇文章主要介绍"SpringBoot如何在一定时间内限制接口请求次数",在日常操作中,相信很多人在SpringBoot如何在一定时间内限制接口请求次数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"SpringBoot如何在一定时间内限制接口请求次数"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
需要用到的知识:注解、AOP、ExpiringMap(带有有效期的映射)
我们可以自定义注解,把注解添加到我们的接口上。定义一个切面,执行方法前去ExpiringMap查询该IP在规定时间内请求了多少次,如超过次数则直接返回请求失败。
需要用到的依赖
org.springframework.boot spring-boot-starter-aop 2.1.5.RELEASE net.jodah expiringmap 0.5.8
自定义注解@LimitRequest
@Documented@Target(ElementType.METHOD) // 说明该注解只能放在方法上面@Retention(RetentionPolicy.RUNTIME)public @interface LimitRequest { long time() default 6000; // 限制时间 单位:毫秒 int count() default 1; // 允许请求的次数}自定义AOP
@Aspect@Componentpublic class LimitRequestAspect { private static ConcurrentHashMap> book = new ConcurrentHashMap<>(); // 定义切点 // 让所有有@LimitRequest注解的方法都执行切面方法 @Pointcut("@annotation(limitRequest)") public void excudeService(LimitRequest limitRequest) { } @Around("excudeService(limitRequest)") public Object doAround(ProceedingJoinPoint pjp, LimitRequest limitRequest) throws Throwable { // 获得request对象 RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) ra; HttpServletRequest request = sra.getRequest(); // 获取Map对象, 如果没有则返回默认值 // 第一个参数是key, 第二个参数是默认值 ExpiringMap uc = book.getOrDefault(request.getRequestURI(), ExpiringMap.builder().variableExpiration().build()); Integer uCount = uc.getOrDefault(request.getRemoteAddr(), 0); if (uCount >= limitRequest.count()) { // 超过次数,不执行目标方法 return "接口请求超过次数"; } else if (uCount == 0){ // 第一次请求时,设置有效时间// /** Expires entries based on when they were last accessed */// ACCESSED,// /** Expires entries based on when they were created */// CREATED; uc.put(request.getRemoteAddr(), uCount + 1, ExpirationPolicy.CREATED, limitRequest.time(), TimeUnit.MILLISECONDS); } else { // 未超过次数, 记录加一 uc.put(request.getRemoteAddr(), uCount + 1); } book.put(request.getRequestURI(), uc); // result的值就是被拦截方法的返回值 Object result = pjp.proceed(); return result; } } 第一个静态Map是多线程安全的Map(ConcurrentHashMap),它的key是接口对于的url,它的value是一个多线程安全且键值对是有有效期的Map(ExpiringMap)。
ExpiringMap的key是请求的ip地址,value是已经请求的次数。
ExpiringMap更多的使用方法可以参考:https://github.com/jhalterman/expiringmap

最后在方法上面加上@LimitRequest就行了

到此,关于"SpringBoot如何在一定时间内限制接口请求次数"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
次数
方法
接口
时间
注解
限制
学习
有效
更多
安全
切面
参数
对象
有效期
知识
线程
帮助
实用
接下来
使用方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
大华平台管理软件添加存储服务器
迷你玩家为什么破坏mc服务器
数据库表怎么自己增长
网络安全知识内容黑板报
数据库系统的结构有
网络数据库的评价指标包括什么
美信服务器连接异常怎么办
网络安全工程师项目经历游戏
剑网三服务器青梅推荐吗
湖南省耕地质量等别数据库
sqlite数据库架设
计算机网络技术需要打字好吗
深圳汽车软件开发设计
绿园区正规网络技术咨询口碑推荐
用友t3数据库文件夹
慈溪市网络安全宣传
驿烽天下网络技术
数据库院系编号
数据库建立会员表
网络安全平稳有序
2u4路服务器
python导出表数据库
云服务器商家导航
关系数据库关系代数练习题
各种剪网络技术
nbu管理端连接不上主服务器
上海办公系统软件开发
数据库系统原理习题答案
数据库怎么查同学过生日
网络安全法就是抓你