Spring Boot开发——结合Redis实现接口防止重复提交

ops/2025/1/12 0:26:48/

文章目录

  • 一、准备工作
    • 1、引入依赖
    • 2、配置Redis
  • 二、实现代码
    • 1、创建Redis服务类
    • 2、创建AOP切面类
    • 3、自定义注解
    • 4、处理异常
    • 5、使用注解
  • 三、测试验证
    • 1、启动Redis服务
    • 2、启动Spring Boot应用
    • 3、模拟重复提交

在Web开发中,防止用户重复提交表单是一个常见的需求。例如,在用户点击提交按钮后,由于网络延迟或其他原因,用户可能会多次点击,导致数据被重复提交。这不仅会造成数据冗余,还可能引发业务逻辑错误。本文将介绍如何使用Spring Boot结合Redis来实现一个高效的接口防重提交机制。

一、准备工作

1、引入依赖

在Spring Boot项目的pom.xml文件中添加Redis和Spring Data Redis的依赖。

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

2、配置Redis

在application.properties或application.yml文件中配置Redis的连接信息。

spring.redis.host=localhost
spring.redis.port=6379

二、实现代码

1、创建Redis服务类

编写一个Redis服务类,用于操作Redis。这里我们使用Spring Data Redis提供的StringRedisTemplate。

@Service
public class RedisService {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String REPEAT_SUBMIT_KEY_PREFIX = "repeat_submit:";/*** 设置防重提交标识* @param userId 用户ID* @param requestId 请求ID* @param expireTime 过期时间(秒)*/public void setRepeatSubmitKey(String userId, String requestId, long expireTime) {String key = REPEAT_SUBMIT_KEY_PREFIX + userId + ":" + requestId;redisTemplate.opsForValue().set(key, "1", expireTime, TimeUnit.SECONDS);}/*** 检查是否存在防重提交标识* @param userId 用户ID* @param requestId 请求ID* @return 存在返回true,不存在返回false*/public boolean hasRepeatSubmitKey(String userId, String requestId) {String key = REPEAT_SUBMIT_KEY_PREFIX + userId + ":" + requestId;return redisTemplate.hasKey(key);}
}

2、创建AOP切面类

编写一个AOP切面类,用于拦截需要防重提交的接口,并在执行前检查Redis中是否存在防重提交标识。

@Aspect
@Component
public class RepeatSubmitAspect {@Autowiredprivate RedisService redisService;@Before("@annotation(RepeatSubmit)")public void beforeMethod(JoinPoint joinPoint, RepeatSubmit repeatSubmit) throws Throwable {// 获取当前用户ID和请求ID(这里假设通过ThreadLocal获取,实际项目中可能通过Session、JWT等方式获取)String userId = "当前用户ID"; // 替换为实际获取用户ID的代码String requestId = UUID.randomUUID().toString(); // 使用UUID作为请求ID// 检查Redis中是否存在防重提交标识if (redisService.hasRepeatSubmitKey(userId, requestId)) {throw new RepeatSubmitException("请勿重复提交");}// 设置防重提交标识(设置过期时间,如60秒)redisService.setRepeatSubmitKey(userId, requestId, repeatSubmit.expireTime());}
}

3、自定义注解

创建一个自定义注解@RepeatSubmit,用于标记需要防重提交的接口。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatSubmit {long expireTime() default 60; // 默认过期时间60秒
}

4、处理异常

创建一个自定义异常RepeatSubmitException,用于在检测到重复提交时抛出。

public class RepeatSubmitException extends RuntimeException {public RepeatSubmitException(String message) {super(message);}
}

5、使用注解

在需要防重提交的接口上使用@RepeatSubmit注解。

@RestController
@RequestMapping("/api")
public class DemoController {@PostMapping("/submit")@RepeatSubmit(expireTime = 60)public ResponseEntity<String> submit(@RequestBody DemoRequest request) {// 业务逻辑处理return ResponseEntity.ok("提交成功");}
}

三、测试验证

1、启动Redis服务

确保Redis服务已启动并运行。

2、启动Spring Boot应用

运行Spring Boot应用,访问需要防重提交的接口。

3、模拟重复提交

使用postman等测试工具在接口响应前多次点击提交按钮,观察是否抛出RepeatSubmitException异常。


http://www.ppmy.cn/ops/149293.html

相关文章

Mysql--基础篇--函数(字符串函数,日期函数,数值函数,聚合函数,自定义函数及与存储过程的区别等)

MySQL提供了丰富的内置函数&#xff0c;涵盖了字符串处理、数值计算、日期和时间操作、聚合统计、控制流等多种功能。这些函数可以帮助你简化SQL查询&#xff0c;提升开发效率。 除了内置函数&#xff0c;MySQL还支持自定义函数&#xff08;User-Defined Functions&#xff09;…

el-upload on-preview 扩大预览事件点击范围

1.首先说明开发环境&#xff0c;vue2项目&#xff0c;采用列表模式的el-upload组件时&#xff0c;加入附件预览功能 element官网给出的示范代码是以下写法 <el-uploadclass"upload-demo"action"https://jsonplaceholder.typicode.com/posts/":on-previ…

【Linux】Linux开发:GDB调试器与Git版本控制工具指南

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建 在 Linux 开发中&#xff0c;GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题&#xff0c;G…

三天学完微服务其二

Nacos注册中心 启动Nacos 配置更新步骤 是修改nacos中的配置后&#xff0c;微服务中无需重启即可让配置生效&#xff0c;也就是**配置热更新**。 方式一 在Value注入的变量所在类上添加注解RefreshScope 方式二 使用ConfigurationProperties注解代替Value注解。 Nacos快速…

GO通过SMTP协议发送邮件

什么是SMTP协议 SMTP&#xff08;Simple Mail Transfer Protocol&#xff0c;简单邮件传输协议&#xff09;是用于发送邮件的协议。当一个邮件服务器需要发送邮件给另一个邮件服务器时&#xff0c;它会使用SMTP协议与目标服务器建立连接&#xff0c;并传输邮件内容。SMTP协议的…

Scala语言的面向对象编程

Scala语言的面向对象编程 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来组织代码&#xff0c;这些对象能够包含数据&#xff08;属性&#xff09;以及功能&#xff08;方法&#xff09;。Scala…

spring boot 多数据源集成mysql、postgresql、phoenix、doris等

如何搭建多数据源项目只要以下简单几步; 一. 创建核心在config.datasource文件夹里 二. 引入相对应的jar包 三. 创建数据库连接配置 四. 写逻辑代码进行验证 1.DataSource package com.irootech.config.datasource;import java.lang.annotation.*;Target({ElementType.MET…

基于Spring Boot的宠物健康顾问系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…