AOP自定义注解防重

news2024/11/13 8:02:59

 Spring Boot 防重提交注解实现与实战示例

在Web开发中,防止用户重复提交表单是一个常见的需求。本文将详细介绍如何在Spring Boot中通过自定义注解和AOP技术实现防重提交功能,并提供一个完整的示例。

 一、背景介绍

重复提交问题通常出现在用户在短时间内多次点击提交按钮的场景,比如在提交表单或进行支付操作时。这种情况可能会导致数据错误或产生额外的费用。为了解决这个问题,我们可以使用分布式锁或基于Redis的防重机制。

 二、技术方案

本文将采用Redis和Spring AOP来实现防重提交注解。以下是技术方案的步骤:

1. 创建一个防重提交的注解。
2. 实现一个AOP切面,用于处理注解逻辑。
3. 在Controller中使用该注解。

 三、创建防重提交注解

首先,我们创建一个名为 @RepeatSubmitToken 的注解。

import java.lang.annotation.*;
import org.springframework.stereotype.Component;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Component
public @interface RepeatSubmitToken {
    // 可以添加一些属性,比如锁的过期时间等
}

 四、实现AOP切面

接下来,我们创建一个AOP切面RepeatSubmitAspect,用于处理防重逻辑。

import org.aspectj.lang.annotation.*;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

@Aspect
@Component
public class RepeatSubmitAspect {

    private final StringRedisTemplate redisTemplate;

    public RepeatSubmitAspect(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Around("@annotation(repeatSubmitToken)")
    public Object around(ProceedingJoinPoint point, RepeatSubmitToken repeatSubmitToken) throws Throwable {
        Object[] args = point.getArgs();
        String key = "repeat_submit_token:" + args[0].toString();
        ValueOperations<String, String> ops = redisTemplate.opsForValue();

        boolean exists = ops.setIfAbsent(key, "true", 10, TimeUnit.SECONDS);
        if (!exists) {
            throw new RuntimeException("请勿重复提交");
        }
        try {
            return point.proceed();
        } finally {
            redisTemplate.delete(key);
        }
    }
}

 五、使用防重注解

现在,我们可以在Controller中使用`@RepeatSubmitToken`注解。

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @PostMapping("/submitForm")
    @RepeatSubmitToken
    public String submitForm(String userId, String data) {
        // 处理表单提交逻辑
        return "提交成功";
    }
}

 六、测试与验证

部署应用后,我们可以通过POST请求测试接口,并观察是否能够正确防止重复提交。

1.手动设置锁,等待一秒后输出了 donothing.

2.aop枷锁

代码睡眠3秒,在一秒内多次请求,代码报错,后续输出正常的 do something

如果短时间内连续发送多次请求,应该会看到“请勿重复提交”的异常信息。

七、总结

通过自定义注解和AOP技术,我们可以在Spring Boot应用中轻松实现防重提交功能。这种方法不仅代码简洁,而且易于维护和扩展。

以上就是一个完整的Spring Boot防重提交注解的实现过程。希望这个示例能够帮助您在实际项目中解决重复提交的问题。

八、有兴趣的同学可以下载代码玩一下

redissonTest: 小草redisson分布式锁的例子,手动加锁和aop加锁,可以配合业务实现业务请求防重

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

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

相关文章

来自OpenAI官网的Function calling介绍与最佳实践

学习如何将大型语言模型连接到外部工具。 介绍 函数调用允许您将模型如gpt-4o与外部工具和系统连接起来。这对于许多事情都很有用&#xff0c;比如为AI助手赋能&#xff0c;或者在你的应用程序与模型之间建立深度集成。 在2024年8月&#xff0c;我们推出了结构化输出功能。当…

8月27日笔记

活动目录的访问 AD Explorer LDAP&#xff08; Lightweight Directory Access Protocol&#xff0c;轻量目录访问协议&#xff09;是一种基于TCP/IP的应用层协议&#xff0c;用于访问和维护分布式目录信息服务。它允许用户在一个网络中查找和管理存储在目录服务中的信息。是在…

SCADA 系统开启车间智能可视化

在当今高速发展的工业时代&#xff0c;车间的高效运作与精准管理至关重要。然而在自动化设备、仪表、传感器等应用的现今&#xff0c;其产生的数据越来越庞大&#xff0c;要想将这些数据充分利用起来&#xff0c;并且形成更易分析的信息&#xff0c;则需要SCADA 系统来进行采集…

参数高效的迁移学习在自然语言处理中的应用

人工智能咨询培训老师叶梓 转载标明出处 迁移学习技术&#xff0c;尤其是针对大型预训练模型的微调&#xff08;fine-tuning&#xff09;&#xff0c;在诸多下游任务中展现出了卓越的性能。然而&#xff0c;当面临众多任务时&#xff0c;传统的微调方法存在参数效率低下的问题…

鸿蒙开发:深入浅出Stage模型(UIAbility组件)

&#x1f680;一、UIAbility组件 &#x1f50e;1.概述 HarmonyOS中的Stage模型是一种基于UIAbility组件的应用程序架构。UIAbility是HarmonyOS系统中用于构建用户界面的基本组件之一。它负责处理应用程序界面的显示和交互。 在Stage模型中&#xff0c;每个应用程序都有一个或…

【Qt笔记】QCommandLinkButton控件详解

目录 引言 一、概述 二、特性与属性 1. 属性 2. 样式 三、基本用法 1. 引入必要的头文件 2. 创建和配置 QCommandLinkButton 3. 布局管理 四、高级用法 1. 自定义绘制 2. 动态内容更新 五、代码解析示例 注意 总结 引言 QCommandLinkButton 是 Qt 框架中 QtWi…

招生简章如何制作为在线版的网址链接?

​随着互联网的高速发展&#xff0c;越来越多的学校和企业选择通过在线方式发布招生简章。这种趋势不仅方便了大量用户&#xff0c;还大大降低了传统纸质招生简章的制造成本。那么&#xff0c;如何制作一份吸引眼球的在线招生简章呢&#xff1f; 1.要制作电子杂志,首先需要选择…

leetcode_001_两数之和解析

两数之和解析 题目: 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按任意顺序…

【解压即玩】使命de召唤4

《使命de召唤4》 立即下载&#xff1a;【chumenx.com】【解压即玩】使命de召唤4

Leetcode 51. 皇后 回溯 C++实现

Leetcode 51. 皇后 问题&#xff1a;按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不…

Spring框架基础

前言 本文将讲解spring框架的基础内容 Spring 首先,我们需要了解,spring是什么? spring是一个轻量级的IOC和AOP的一站式java开发框架 作用是简化企业级开发 轻量级:框架体积小(核心模块) 其中 IOC: Inversion of Control 控制反转 IOC的作用是可以把创建对象的控制权,反转给s…

学习区块链?看我就够了!

写在前面&#xff0c;本文提到的所有书籍资源&#xff0c;都提供免费下载地址 内含pdf&#xff0c;epub,mobi等格式 一.区块链&#xff1a;定义未来金融与经济新格局 以区块链技术为核心构建的价值互联网 将深刻改变未来的金融与经济格局 文明向前发展&#xff0c;有些成果的…

Linux基础软件-共享存储nfs

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux进阶部分又分了很多小的部分,我们刚讲完了Linux日常运维。讲的那些东西都算是系统自带的&#xff0c;但是Linux作为一个…

大模型之二十七-语音识别Whisper实例浅析

Whisper简介 Whisper是OpenAI于2022年9月开源的一个多语种识别模型&#xff0c;目前支持99种语言&#xff0c;是目前性能最好的开源多语种识别ASR大模型&#xff0c;第一版版使用了68万小时标注好的语料预训练模型&#xff0c;而large-v3的标注数据超过了500万小时&#xff0c…

QL5010-16-ASEMI逆变焊机专用整流桥QL5010

编辑&#xff1a;ll QL5010-16-ASEMI逆变焊机专用整流桥QL5010 型号&#xff1a;QL5010 品牌&#xff1a;ASEMI 封装&#xff1a;KBPC-4 批号&#xff1a;2024 类型&#xff1a;整流模块 电流&#xff1a;50A 电压&#xff1a;1600V 安装方式&#xff1a;直插式封装 …

(2)Studio 5000 Logix Emulate仿真使用方法

Studio 5000 Logix Emulate仿真使用方法 引言&#xff1a;首先要安装好Studio 5000 logix emulate&#xff0c;这个软件也是需要授权的。还需要注意仿真器与studio 5000之间版本的对应&#xff0c;studio5000的版本需要小于仿真器版本。 打开Studio 5000 logix emulate&#x…

Lombok组件的使用

什么是Lombok Lombok是一个Java库&#xff0c;能自动插入编辑器并构建工具&#xff0c;简化Java开发。通过添加注解的方式&#xff0c;不需要为类编写getter或eques方法&#xff0c;同时可以自动化日志变量。 Lombok的使用 使用Lombok需要的开发环境JavaMavenIntelliJ IDEA或…

游戏开发设计模式之桥接模式

目录 桥接模式在游戏开发中的具体应用案例是什么&#xff1f; 如何在Unity或Unreal Engine中实现桥接模式以提高游戏引擎与场景的灵活性&#xff1f; 桥接模式与其他设计模式&#xff08;如适配器模式、模板方法模式&#xff09;在游戏开发中的比较优势是什么&#xff1f; …

【Verilog 数字系统设计教程】Verilog 基础:硬件描述语言入门指南

目录 摘要 1. 引言 2. Verilog 历史与发展 3. Verilog 基本语法 4. Verilog 模块与端口 5. 组合逻辑与时序逻辑 6. 时钟域与同步设计 7. 测试与仿真 8. Verilog 高级特性 任务&#xff08;Tasks&#xff09; 函数&#xff08;Functions&#xff09; 多维数组 结构体…

MinGW-w64 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z

MinGW-w64 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 安装包 链接: https://pan.baidu.com/s/1G8SDlDcBtNU4TCBuLL9XYw?pwdv587 提取码: v587 是7z文件&#xff0c;解压即可&#xff0c;自动得到一个mingw64文件夹。 自存&#xff0c;应该能用