自定义防止重复提交注解@PreventDuplicateSubmit,Spring Aop

CZT与FFT频谱分析方法对比:从任意频带重采样到高精度频谱分析 M = 85 % 输出点数f0 = 70 Hz % 起始频率DELF = 0.4 Hz % 频率步长频率分辨率提高到0.4 Hz分析带宽聚焦在[70, 103.6]Hz更清晰地分辨出78Hz和82Hz的频率分量。 阅读详情
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface PreventDuplicateSubmit {
    /** 请求间隔时间,单位秒,该时间范围内的请求为重复请求 */
    int intervalTime() default 1;
    /** 返回的提示信息 */
    String msg() default "请不要频繁重复请求!";
}
@Component
public class PreventDuplicateSubmitCache {

    /**
     * 重复提交缓存
     */
    public static final Map<Date, String> REPEAT_REQUEST = new HashMap<>();

    /**
     * 向缓存中存入数据
     *
     * @param key
     * @param value
     */
    public void add(Date key, String value) {
        REPEAT_REQUEST.put(key, value);
    }

}
@Component
@Aspect
@Order(100)
public class PreventDuplicateSubmitHandler {
    @Resource
    private PreventDuplicateSubmitCache requestCache;

    // 定义注解类型的切点
    @Pointcut("@annotation(fish.api.server.security.PreventDuplicateSubmit)")
    public void arrPointcut() {
    }

    // 实现过滤重复请求功能
    @Around("arrPointcut()")
    public Object arrBusiness(ProceedingJoinPoint joinPoint) {

        // 获取 map value,由 session id 和 请求URI 构成
        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        HttpServletRequest request = sra.getRequest();
        String value = request.getSession().getId() + "_" + request.getRequestURI();

        // 获取方法的 AvoidRepeatRequest 注解
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        PreventDuplicateSubmit arr = method.getAnnotation(PreventDuplicateSubmit.class);

        // 判断是否是重复的请求
        Date now = new Date();
        requestCache.add(now, value);
        List<Date> list = new ArrayList<>();
        Map<Date, String> map = PreventDuplicateSubmitCache.REPEAT_REQUEST;
        for (Map.Entry<Date, String> entry : map.entrySet()) {
            if (entry.getKey().equals(now) && entry.getValue().equals(value)) {
                continue;
            }
            list.add(entry.getKey());
            //传入的时间和原本时间的差值(秒)
            int difference = (int) (now.getTime() - entry.getKey().getTime()) / 1000;
            //如果时间差小于设定值为重复提交
            if (difference < arr.intervalTime()) {
                return new Result<>(902, arr.msg());
            }
        }
        //删除之前的数据
        if (CollUtil.isNotEmpty(list)) {
            list.forEach(map::remove);
        }


        try {
            // 非重复请求,执行业务代码
            return joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return ("error");
        }
    }

}

应用

Oracle Primavera P6实战手册:从入门到精通的企业项目管理秘籍 本文详细介绍了Oracle Primavera P6在企业项目管理中的实战应用,从环境配置到高级进度控制技巧,帮助用户从入门到精通。通过WBS设计、资源优化和情景模拟等核心功能,提升项目管理效率。特别适合需要处理复杂项目和多团队协作的企业用户。 阅读详情

相关推荐

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

lichensun的博客 1万+

springboot 防止重复提交

.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rgba(51, 51, 51, 1) } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .ma...

程序员小明1024 9425

PCIe 物理层(Physical Layer)详解

PCIe物理层关键技术解析 PCIe物理层作为协议栈底层核心,承担着比特流传输、链路训练与电气特性管理等关键功能。该层采用分层架构,包含逻辑物理层(负责编解码/加扰)和电气物理层(处理信号收发)。关键技术亮点包括: 智能链路管理:通过LTSSM状态机实现11种状态转换,涵盖链路检测(Detect)、协商(Polling/Configuration)、功耗管理(L0s/L1)等全生命周期控制 高效编码方案:Gen1/Gen2采用8b/10b编码(20%开销),Gen3+升级为128b/130b(仅1.5%开销

珂珂可爱多 730

Spring Boot 接口防重复提交解决方案

本文介绍了三种在Spring Boot中实现接口防重复提交的方法:使用Token机制、使用Redis和使用Spring AOP。每种方法都有其适用场景和优缺点,可以根据实际需求选择合适的方法。通过这些方法,可以有效防止用户重复提交表单,提高系统的稳定性和用户体验。

勤于笔记,成于点滴。 3007

鸿蒙OpenHarmony南向开发 轻量系统芯片移植指南(一)

OpenHarmony系统采用"系统>子系统>部件"层级架构,支持功能模块化裁剪。本文介绍了关键子系统及移植方法:1)启动恢复子系统负责内核到应用间的进程初始化,需配置启动入口标识及链接脚本;2)文件子系统提供基础文件操作接口,需适配HAL层文件读写功能,可通过Flash模拟、轻量文件系统或厂商自有方案实现。移植过程需修改config.json配置,添加对应组件定义及功能实现。系统采用模块化设计,开发者可根据实际需求灵活配置所需子系统功能。

yx525623的博客 1135

Ubuntu22.04+Docker一键部署Autoware Universe避坑指南(附鱼香ROS配置)

本文详细介绍了在Ubuntu22.04系统中使用Docker一键部署Autoware Universe的完整流程,包括鱼香ROS工具链配置、Docker环境优化及VSCode开发环境集成。通过实战指南帮助开发者快速搭建自动驾驶开发环境,解决常见部署问题,提升开发效率。

weixin_29254673的博客 417

SpringBoot-接口防止重复提交

在Spring Boot应用中,防止接口重复提交是一个常见的问题,特别是在处理表单提交或关键业务操作时。重复提交可能会导致数据重复插入、资源浪费或业务逻辑错误。以下是一些常见的方法来防止接口重复提交。

咕德猫宁的博客 2677

深入解析PCIe Retimer:工作原理与典型应用场景

本文深入解析了PCIe Retimer的工作原理与核心价值。作为高速信号的中继再生器,Retimer通过时钟数据恢复和信号再生技术,有效解决长距离或复杂通道中的信号衰减与完整性问题,从而极大地扩展了PCIe链路的有效传输距离。文章详细阐述了其内部架构、自动与手动两种工作模式,并重点介绍了在长距离板间互连、复杂背板设计等典型应用场景中的关键作用。

weixin_29195615的博客 512

SpringBoot中防止接口重复提交多种方法(代码示例)

在Spring Boot应用中,防止接口重复提交是一个常见的需求,尤其是在处理订单、支付等关键业务时。

分享学习 2650

实战|2026美团&大众点评餐饮数据抓取:Playwright/Selenium反爬全攻略

核心结论:2026年美团&大众点评的反爬核心是“多维度风控”,需组合使用“住宅IP+设备指纹伪装+真人行为模拟+动态验证处理”,Playwright是最优工具,Selenium仅作为补充。效率优化:单机爬取速度建议控制在“每小时500-800条”,避免高频请求触发风控;分布式爬取需确保每个节点使用独立住宅IP,且行为轨迹不一致。扩展方向集成WASM解密工具,破解2026年美团的Token加密;用AI识别动态点选验证,提升验证通过率;对接大数据平台,对抓取的餐饮数据进行可视化分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2466

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 187

springboot防重复提交

一般接口提交时会有token验证,表明该请求是合法一个用户。后端可以通过 用户token+类+方法来判断是否是重复请求。RepeatSubmitTestController 文件。

编程技术提升 2650

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

包括YOLOv5、YOLOv7、YOLOv8等模型改进 431

JAVA AOP防止重复提交

通过Aop进行防止重复提交, 把pds-sessionId-请求路径作为请求的唯一key,用户发送请求时,判断key是否存在,如果存在则重复提交,不存在,则进行保存,执行完后或者出现异常进行清除。 key 超时5秒自动清除 一.自定义注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; imp...

刘骐毓的博客 835

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

移动端和web端等多端重复提交问题解决

最近,在搞移动端接口开发。因为,移动端和web端是共用同一套接口,当移动端和web端在同时打开一个表单提交页面的时候,两者不管谁先提交,后者都能够再次提交,这就造成了重复提交的问题,导致数据重复或者错乱。一般情况下,防止重复提交的方式如下:1、前端控制,即提交按钮只能点击一次,点击后,提交按钮便置灰,不允许再次点击。2、数据库层面控制,这就需要想出满足业务需求的唯一索引约束,比如注册的手机号唯一。

胜人者有力,自胜者强! 1155

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

springcloud——全局防重复提交拦截器,自定义注解

最近在csdn上看了很多个,也不知道抄袭的谁的,基本都是错的,所以自己写了一个。4.加上@PreventDuplicateSubmit注解测试,是否成功放行。2.注解切面类(我这个是基于redis去验证的,也可以选择存在其他地方)(注意是使用这个注解会忽略全局防重复提交拦截器)微服务项目或者springboot都可以使用。3.验证(未加注解)

zcl_baoda_lai的博客 877

Java实战:Spring Boot接口防止重复提交

本文将详细介绍如何在Spring Boot应用程序中防止接口重复提交。我们将探讨重复提交的基本概念,以及如何使用Spring Boot和第三方库来实现接口的防重复提交功能。

oandy0的博客 2292

springBoot防重复提交

SpringBoot防重复提交

你要十分努力,才能看起来毫不费力! 4535

springBoot防止重复提交

*** 自定义注解防止表单重复提交*/ @Target(ElementType . METHOD) // 注解只能用于方法 @Retention(RetentionPolicy . RUNTIME) // 修饰注解的生命周期 @Documented public @interface RepeatSubmit {/*** 防重复操作过期时间,默认1s/*** 自定义注解防止表单重复提交。

while(life)++; 1369

防止接口请求重复提交

自定义注解+AOP+Redis实现防止接口重复提交

药岩 1869

13.Spring Boot防止表单重复提交实现方式

(1)点击提交按钮两次(2)点击刷新按钮(3)使用浏览器后退按钮重复之前的操作,导致重复提交表单(4)使用浏览器历史记录重复提交表单(5)浏览器重复的HTTP请求用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。

相互学习 共同进步 1349

SpringBoot自定义注解 + AOP 防止重复提交(建议收藏)

从JDK 1.5开始, Java增加了对元数据(MetaData)的支持,也就是 Annotation(注解)。注解其实就是代码里的特殊标记,它用于替代配置文件,常见的很多,有 @Override、@Deprecated等元注解是注解的注解,比如当我们需要自定义注解时会需要一些元注解(meta-annotation),如@Target和@Retention防重提交方式token令牌方式ip+类+方法方式(方法参数)利用AOP来实现。

欢迎来到我的博客 2295

【SpringBoot】SpringBoot中防止接口重复提交(单机环境和分布式环境)

在Web应用开发过程中,接口重复提交问题一直是一个需要重点关注和解决的难题。无论是由于用户误操作、网络延迟导致的重复点击,还是由于恶意攻击者利用自动化工具进行接口轰炸,都可能对系统造成严重的负担,甚至导致数据不一致、服务不可用等严重后果。特别是在SpringBoot这样的现代化Java框架中,我们更需要一套行之有效的策略来防止接口重复提交。本文将从SpringBoot应用的角度出发,探讨在单机环境和分布式环境下如何有效防止接口重复提交。单机环境虽然相对简单,但基本的防护策略同样适用于分布式环境的部署。

qq_61024956的博客 1万+

SpringBoot防抖方案(防止表单重复提交)

SpringBoot防抖方案(防止表单重复提交)

爱笑的boy的博客 1500

Spring Boot 防止重复提交

Spring Boot 防止重复提交

weixin_44231769的博客 817

防止表单重复提交几种方法+实测

1.前端处理(场景:用于网络延迟情况下用户点击多次submit按钮导致表单重复提交) ①:通过一个标识来控制表单提交之后,再次提交会直接返回处理。 Var isCommitted = false; //表单是否应提交标识,默认为false function dosubmit() { //start hzj If(isCommitted == false){ //提交表单后,将表单是否已经提交设置为true isCommitted = true; //返回true让表单正常提交 ret

ZY__99的博客 7692

16、webpack代码分离--防止公用代码的重复导入

防止重复(prevent duplication) webpack 官网文档里建议使用CommonsChunkPlugin插件可以将公共的依赖模块提取到已有的入口 chunk 中,或者提取到一个新生成的 chunk。但是实际上这个插件在4.3的版本中已经移除,你使用这个插件编译后汇报错,出现“Webpack.optimize.CommonsChunkPlugin has been remo...

gosenkle的专栏 1566
上一篇: 记录Java导出Excel,给某个单元格设置文本格式或者某一列设置文本格式,需要给用户编号列设置为文本格式
下一篇: redis分布式锁
Face_To_Object
博客等级 码龄5年 8粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值