注解实现防止重复提交(Aop)

news/2024/10/16 20:20:34/

一、前言

书接上回,上次实现了springboot整合redis,在使用过程中就避免不了重复提交的场景。springboot整合redis_crazyK.的博客-CSDN博客

重复提交的场景:

  • 用于用户误操作,多次点击表单提交按钮
  • 由于网速等原因造成页面卡顿,用户重复刷新提交页面
  • 恶用户如利用postman等工具重复恶意提交表单

为了防止以上情况的出现需要自定义一个注解来完成防止重复提交操作

二、实现

1.创建一个注解

/*** 自定义注解防止表单重复提交*/
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {int lockTime() default 5;
}

注解参数不懂的小伙伴可以移步这篇文章:java自定义注解_crazyK.的博客-CSDN博客  

2.创建Http请求工具类,用于在切面时获取token使用

public class HttpContextUtils {public static HttpServletRequest httpServletRequest(){return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();}
}

3.项目中加入SpringAop依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

4.创建切面,将切点注册为自定义的注解,唯一表示采用接口url+token的形式,户每发起第一次添加请求,会经过界面,在切面获取信息后组装起来存入Redis,当用户后续发起请求时,首先判断Redis中是否缓存了这个key,如果缓存了,则证明已经提交,于是反馈给前端,如果不存在,证明没有提交,则存入Redis。

@Component
@Aspect
public class NoRepeatSubmitAspect {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Pointcut("@annotation(repeatSubmit)")public void pointcutNoRepeat(NoRepeatSubmit repeatSubmit){};@Around("pointcutNoRepeat(noRepeatSubmit)")public Object doNoRepeat(ProceedingJoinPoint point, NoRepeatSubmit noRepeatSubmit) throws Throwable {int i=noRepeatSubmit.lockTime();HttpServletRequest httpServletRequest = HttpContextUtils.httpServletRequest();String token = httpServletRequest.getHeader("token");String url = httpServletRequest.getRequestURL().toString();String sign = url+"/"+token;Boolean key=redisTemplate.hasKey(sign);if (key){throw new Exception("请勿重复提交");}redisTemplate.opsForValue().set(sign,sign,i, TimeUnit.SECONDS);return  point.proceed();}
}

三、测试

将我们自定义的注解加到对应方法上

先向redis中插入一条key为crazyk,value为csdn的数据

 

提交成功,然后在向redis中存入相同的数据后端会抛出我们在切面自定义的异常

代码已同步至Gitee:RedisBoot: springboot集成redis


http://www.ppmy.cn/news/639578.html

相关文章

C语言-基础语法学习-1 函数

基础语法学习 - 上官新版C语言 目录 基础语法学习 - 上官新版C语言函数函数 - 一维数组作形参C语言函数 - 一维数组作形参函数 - 二维数组作形参C语言函数 - 二维数组作形参 函数 函数 - 一维数组作形参 C语言函数 - 一维数组作形参 当我们需要在C语言中传递一维数组作为函数…

ElasticSearch——布尔查询

Elasticsearch 语雀&#xff08;完整笔记&#xff09; 布尔查询是一个或多个查询子句的组合&#xff0c;每一个子句就是一个子查询。子查询的组合方式有&#xff1a; must&#xff1a;必须匹配每个子查询&#xff0c;类似“与”should&#xff1a;选择性匹配子查询&#xff…

Jetson TX1板载摄像头测试

Data: 2016.12.21 Author: cjh Theme: Test the default camera 继上一篇完成了Jetson TX1的刷机之后&#xff0c;想测测板子上相关的硬件&#xff0c;自己最好奇的还是摄像头如何起来&#xff0c;本想想通过网上找找资料已偷懒的办法快速测测&#xff0c;但网上并没有什么资料…

1 Prometheus-监控简介

目录 1 什么是监控 1.1 技术作为客户 1.2 业务作为客户 2. 监控基础知识 2.1 事后监控 2.2 机械式/模板式/无脑式监控 2.3 不够准确的监控 2.4 静态监控 2.5 不频繁的监控 2.6 缺少自动化或操作繁琐/不便 2.7 监控模式总结 3.监控机制 3.1 探针和内省 3.2 拉取和推…

笔记本无线网卡没有连接到计算机,笔记本没有无线网络连接怎么办 解决方法介绍【图解】...

电脑最开始创立于美国&#xff0c;在美国人发明电脑的时候是想把它用于军事领域的。但是电脑发展到现在&#xff0c;它已经成为了我们的家用电器&#xff0c;除了家庭之外&#xff0c;工作学习时电脑也是必不可少的。而且现在市面上的电脑还有台式的和 笔记本电脑 &#xff0c;…

供应商的一云多芯

一、easystack 最关键的是ESCL(EasyStack Cloud Linux) 、数字原生引擎EOS(EasyStack Operating System)、ECAS (EasyStak Cloud Automation Service)。在一云多芯的场景下&#xff0c;不同物理服务器的差异可能是巨大的&#xff0c;从异构CPU架构&#xff0c;到CPU指令集&…

win8 网络 连接计算机名称,Win8笔记本电脑连接无线网络的方法

无线网络给我们带来了很多方便&#xff0c;不仅电脑可以上可以使用无线网络&#xff0c;而且手机上还可以使用。而对于刚接触Win8系统的用户来说&#xff0c;笔记本连接无线网络有点不熟悉&#xff0c;不知道在哪里连接。那Win8笔记本电脑如何连接无线网络&#xff1f;接下来就…

笔记本计算机没有没有显示无线网络连接,笔记本没有无线网络连接,教您笔记本没有无线网络连接...

使用笔记本的用户都知道&#xff0c;笔记本电脑中自带有无线网卡&#xff0c;可以方便用户们连接无线网络进行上网&#xff0c;然而有些笔记本win7系统用户却发现电脑不显示无线网络连接&#xff0c;笔记本没有无线网络连接&#xff0c;那么该怎么去解决呢&#xff1f;下面&…