Spring控制重复请求
通过AOP拦截所有请求,控制在规定时间内请求次数。
1:添加maven
<dependency><groupId>net.jodah</groupId><artifactId>expiringmap</artifactId><version>0.5.10</version>
</dependency>
2:全局注解
import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;/*** @Description 是否重复提交注解(在方法上,例: @IsRepeatSubmit 或者 @IsRepeatSubmit(count = 2,time = 2000),参数不写使用默认值)* @Author WangKun* @Date 2024/5/22 16:52* @Version*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IsRepeatSubmit {/*** 限制时间单位 单位:毫秒**/TimeUnit TIME_UNIT = TimeUnit.MILLISECONDS;/*** 限制时间 单位:毫秒**/long time() default 1000;/*** 限制时间内允许请求的次数**/int count() default 1;}
3:AOP切面
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.harmonywisdom.requestaop.IsRepeatSubmit;
import com.harmonywisdom.response.ResponseResult;
import com.harmonywisdom.utils.HttpContextUtil;
import com.harmonywisdom.utils.RequestUtil;
import lombok.extern.slf4j.Slf4j;
import net.jodah.expiringmap.ExpirationPolicy;
import net.jodah.expiringmap.ExpiringMap;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;/*** @Description 重复提交切面* @Author WangKun* @Date 2024/5/22 16:57* @Version*/
@Slf4j
@Aspect
@Component
public class RepeatSubmitAspect {/*** 全局缓存**/private static final ConcurrentHashMap<String, ExpiringMap<String, Integer>> CE = new ConcurrentHashMap<>();/*** @Description 切点* @param irs* @Throws* @Return void* @Date 2024-05-28 15:41:56* @Author WangKun**/@Pointcut("@annotation(irs)")public void excludeService(IsRepeatSubmit irs) {}/*** @Description 切面* @param pjp* @param irs* @Throws* @Return java.lang.Object* @Date 2024-05-28 15:41:42* @Author WangKun**/@Around("excludeService(irs)")public Object doAround(ProceedingJoinPoint pjp, IsRepeatSubmit irs) throws Throwable {// 从上下文获取requestHttpServletRequest request = HttpContextUtil.getHttpServletRequest();MethodSignature signature = (MethodSignature) pjp.getSignature();Method method = signature.getMethod();Object[] args = pjp.getArgs();//获取request中数据(获取@RequestBody ,@RequestParam注解的参数)String data = RequestUtil.getParameter(request, method, args);JSONObject obj = JSON.parseObject(data);/** 以下根据自己的业务调整**///ipString ip = request.getRemoteAddr();//uriString uri = request.getRequestURI();//getOrDefault方法,没有该key则使用该keyExpiringMap<String, Integer> em = CE.getOrDefault(uri+"_"+ip, ExpiringMap.builder().variableExpiration().build());Integer count = em.getOrDefault(ip, 0);if (count >= irs.count()) {return ResponseResult.error(500,"请勿重复提交");} else if (count == 0) {em.put(ip, count + 1, ExpirationPolicy.CREATED, irs.time(), irs.TIME_UNIT);} else {em.put(ip, count + 1);}CE.put(uri+"_"+ip, em);return pjp.proceed();}}
RequestUtil.getParameter(request, method, args)
获取@RequestBody ,@RequestParam注解的参数-CSDN博客
HttpServletRequest request = HttpContextUtil.getHttpServletRequest();
Spring 获取http上下文-CSDN博客
相关文章:
Spring控制重复请求
通过AOP拦截所有请求,控制在规定时间内请求次数。 1:添加maven <dependency><groupId>net.jodah</groupId><artifactId>expiringmap</artifactId><version>0.5.10</version> </dependency> 2&#x…...
AWS安全性身份和合规性之Key Management Service(KMS)
AWS Key Management Service(KMS)是一项用于创建和管理加密密钥的托管服务,可帮助客户保护其数据的安全性和机密性。 比如一家医疗保健公司需要在AWS上存储敏感的病人健康数据,需要对数据进行加密以确保数据的机密性。他们使用AW…...
esp32 固件备份 固件恢复
首先是固件备份,这个在产品的工程管理中还是相当重要的。由于工具链的更新(工具版本),以及板子或其上物料的变更(硬件版本),或者新的库的导入或原有库的删除,PCBA是分分钟有可能死给…...

linux开发之设备树四、设备树中断节点
中断节点 这里是由原厂的BSP工程师写的一部分 在CPU的外部有一个GIC控制器,外设会连接在GIC控制器上 设备树是对硬件进行描述的,所以设备树会对CPU进行描述,也要对GIC 控制器进行描述,这部分的代码由原厂的BSP工程师进行编写&…...

基于STM32实现智能楼宇对讲系统
目录 引言环境准备智能楼宇对讲系统基础代码示例:实现智能楼宇对讲系统 音频输入和输出按键控制显示屏和用户界面网络通信应用场景:楼宇安防与智能家居问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现智能…...
面试专区|【DevOps-46道DevOps高频题整理(附答案背诵版)】
简述什么是 DevOps工作流程 ? DevOps工作流程是一种将开发和运维团队紧密结合起来的方法,旨在实现软件开发和交付的高效性和可靠性。它强调自动化和持续集成,以便频繁地进行软件交付和部署。 DevOps工作流程通常包括以下阶段: …...
算法基础之台阶-Nim游戏
台阶-Nim游戏 核心思想:博弈论 可以看作第i阶台阶上有i个含有i个石子的堆这样所有台阶上一共n!个堆就变成了经典Nim优化:发现偶数阶台阶上2n堆异或 0 , 奇数阶台阶异或 原本石子数量 因此 当遍历到奇数阶时异或一下就行 #include <iostream>…...
VUE3注册指令的方法
指令注册只能全局指令和选项式页面指令,composition api没有页面指令 选项式页面指令 <template><div class"home"><h3>自定义指令</h3><div class"from"><el-input type"text" v-focus v-model"name&q…...

【Python】 Python 字典查询:‘has_key()‘ 方法与 ‘in‘ 关键字的比较
基本原理 在 Python 中,字典(dict)是一种非常常用的数据结构,用于存储键值对。字典的查询操作是编程中常见的任务之一。在 Python 2.x 版本中,has_key() 方法被用来检查字典中是否存在某个键。然而,在 Pyt…...

IDEA通过tomcat运行注意事项
配置run--》edit configurations 以下的A B部分要保持一致 A和B的路径要保持一致...
Unity Hub 添加模块报错 Validation Failed 的解决办法
提供两种方法,请自行选择其中一种。 在C:\Windows\System32\drivers\etc\hosts中添加下面的内容并保存后,完全关闭Unity Hub并重新打开,再次尝试下载刚刚失败的模块。 127.0.0.1 public-cdn.cloud.unity3d.com 127.0.0.1 public-cdn.cloud.…...

软件功能测试的类型和流程分享
在现代社会,软件已经成为人们生活中不可或缺的一部分,而在软件的开发过程中,功能测试是不可或缺的环节。软件功能测试指的是对软件系统的功能进行检查和验证,以确保软件在各种情况下能够正常运行,并且能够按照用户需求…...

【C语言】atoi函数的使用及模拟实现
atoi (ascii to integer),是把参数 str 所指向的字符串转换为一个整数(int类型)的库函数。 使用场景 引子: 有兴趣的朋友可以听我逐句翻译一下cpluscplus.com里的这段解释(要考六级了练一下): …...
Golang:使用bndr/gotabulate实现美观的打印表格数据
bndr/gotabulate 可以使用 Go 语言简单、美观的打印表格数据 文档 https://pkg.go.dev/github.com/bndr/gotabulatehttps://github.com/bndr/gotabulate 安装 go get github.com/bndr/gotabulate代码示例 package mainimport ("fmt""github.com/bndr/gotab…...

充电宝哪款好用?什么牌子充电宝耐用?充电宝选购要点总结
随着科技的飞速发展,充电宝已成为现代生活的必备之物。无论是日常通勤、旅行出差,还是在紧急情况下,充电宝都能为我们的电子设备提供可靠的电力支持。然而,面对市场上众多品牌和型号的充电宝,如何选择一款性价比高的充…...

【启程Golang之旅】基本变量与类型讲解
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...

使用docker部署项目
一、docker私有镜像仓库 1、docker私有镜像仓库 库(Repository)是集中存放镜像的地方,又分为公共镜像和私有仓库。 当我们执行docker pull xxx的时候,它实际上是从registry.docker.com这个地址去查找,这就是Docker公…...

智慧林业云巡平台 客户端和移动端(支持语音和视频)自动定位巡护,后端离线路线监测
目前现状 无法客观、方便地掌握护林员的到位情况,因而无法有效地保证巡护人员按计划要求,按时按周期对所负责的林区开展巡护,使巡护工作的质量得不到保证。遇到火情、乱砍滥伐等灾情时无法及时上报处理,现场状况、位置等信息描述…...

【最优化方法】实验三 无约束最优化方法的MATLAB实现
实验的目的和要求:通过本次实验使学生进一步熟悉掌握使用MATLAB软件,并能利用该软件进行无约束最优化方法的计算。 实验内容: 1、最速下降法的MATLAB实现 2、牛顿法的MATLAB实现 3、共轭梯度法的MATLAB…...

kafka-偏移量图解
生产者偏移量:生产者发送消息时写入到哪个位置(主题的每个分区会存储一个 leo 即将写入消息的偏移量),每次写完消息 leo 会 1 消费者偏移量:消费者从哪个位置开始消费消息,小于等于 leo,每个组…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...