SpringBoot如何在一定时间内限制接口请求次数
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要介绍"SpringBoot如何在一定时间内限制接口请求次数",在日常操作中,相信很多人在SpringBoot如何在一定时间内限制接口请求次数问题上存在疑惑,小编查阅了各式资料,整理出简单好
千家信息网最后更新 2025年02月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安全错误
数据库的锁怎样保障安全
数据库是怎么冷却的
我网络安全小卫士手抄报
登录不了服务器什么原因
数据库test
互联网科技风头像
华为网络技术挑战赛
公安网络安全专业测试
客户管理数据库模型
英汉网络安全词汇
mysql 建数据库脚本
电脑服务器可以装显卡吗
移动支付网数据库栏目
下载缓存服务器
网络安全是不是核心期刊
烟台嵌入式软件开发
江苏义迅网络技术
文件服务器客户机复制文件速度
网络安全手抄报电子版图片
浙江杰拉网络技术有限公司
软件开发个人简历样本范文
安徽省软件开发大专学院排名
r740数据库怎么装
excel记账数据库模板
服务器有哪些接口
常熟口碑好的网络技术联系人
js调用数据库
关于网络安全的政治心得
两个服务器连接
小云计算的服务器为虚拟服务
数据库系统概论习题及解析