程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 后端手册

    • 分页实现
    • 导入导出功能
    • 文件上传与下载
    • 权限注解实现
    • 事务管理详解
    • 全局异常处理
    • 参数验证详解
    • 数据脱敏详解
    • 系统日志功能实现
    • 数据权限控制
    • 多数据源实现
    • 代码生成功能
    • 定时任务实现
    • 系统接口文档生成
    • 防重复提交实现
      • 一、@RepeatSubmit 注解参数说明
      • 二、@RepeatSubmit 注解的使用示例
        • 1. 采用默认参数防止重复提交
        • 2. 指定防重复时间和错误消息
      • 三、@RepeatSubmit 注解的实现逻辑
      • 四、防重复提交的注意事项
      • 五、总结
    • 国际化支持
    • 新建子模块
  • 前端手册

  • 组件文档

  • 数据库分析

  • 若依框架
  • 后端手册
scholar
2024-08-31
目录

防重复提交实现

# 防重复提交实现

在Web应用开发中,防止用户短时间内多次提交相同请求是非常重要的。为了避免重复提交导致的数据处理问题,若依框架提供了一个简单而有效的防重复提交机制。通过在接口方法上添加 @RepeatSubmit 注解,可以轻松实现防重复提交功能。本文将详细介绍该功能的使用方法及其实现细节。

# 一、@RepeatSubmit 注解参数说明

@RepeatSubmit 注解用于防止用户在短时间内多次提交相同请求。以下是该注解的参数说明:

参数 类型 默认值 描述
interval int 5000 间隔时间(毫秒),小于此时间视为重复提交。默认值为 5000 毫秒,即 5 秒。
message String 不允许重复提交,请稍后再试 当检测到重复提交时,返回的提示消息。

# 二、@RepeatSubmit 注解的使用示例

# 1. 采用默认参数防止重复提交

在接口方法上添加 @RepeatSubmit 注解,不指定任何参数时,将采用默认的防重复提交间隔时间 5000 毫秒(5 秒),并返回默认的提示消息。

import com.ruoyi.common.annotation.RepeatSubmit;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户管理控制器
 * 
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/user")
public class UserController {

    /**
     * 新增用户接口
     * 
     * @param user 用户信息
     * @return 操作结果
     */
    @RepeatSubmit
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(User user) {
        // 调用服务层逻辑处理
        return success(userService.insertUser(user));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  • 默认行为:
    • 如果用户在 5 秒内再次提交相同请求,将返回默认的错误消息 "不允许重复提交,请稍后再试"。

# 2. 指定防重复时间和错误消息

在某些场景下,可能需要自定义防重复提交的间隔时间和错误消息。可以通过设置 interval 和 message 参数来实现。

import com.ruoyi.common.annotation.RepeatSubmit;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * 订单管理控制器
 * 
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/order")
public class OrderController {

    /**
     * 新增订单接口
     * 
     * @param order 订单信息
     * @return 操作结果
     */
    @RepeatSubmit(interval = 1000, message = "请求过于频繁,请稍后再试")
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addOrder(Order order) {
        // 调用服务层逻辑处理
        return success(orderService.insertOrder(order));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  • 自定义行为:
    • 如果用户在 1 秒(1000 毫秒)内再次提交相同请求,将返回自定义的错误消息 "请求过于频繁,请稍后再试"。

# 三、@RepeatSubmit 注解的实现逻辑

@RepeatSubmit 注解背后的实现逻辑是基于请求的唯一性标识和时间间隔判断。具体来说,以下是核心逻辑的概述:

  1. 请求标识生成:

    • 在每次请求到达时,框架会生成一个唯一的请求标识(通常基于请求的URL、请求参数、用户ID等信息)。
  2. 请求时间存储:

    • 每次请求到达时,系统会将请求标识与当前时间存储在缓存或会话中。
  3. 时间间隔判断:

    • 当新的请求到达时,系统会检查该请求标识是否已经存在于缓存中。如果存在,则比较当前时间与上次请求时间的间隔。
  4. 重复请求处理:

    • 如果请求的时间间隔小于注解中定义的 interval 时间,则视为重复提交,返回指定的 message 提示信息。
  5. 正常请求处理:

    • 如果时间间隔超过了定义的 interval,则认为是正常请求,继续处理并更新缓存中的时间记录。

# 四、防重复提交的注意事项

  • 缓存管理: 防重复提交的实现依赖于缓存技术,需要根据实际情况选择合适的缓存方案(如 Redis、Ehcache 等)。需要确保缓存的稳定性和高可用性。

  • 分布式场景: 在分布式系统中,需要考虑不同节点之间的请求同步问题。可以使用分布式缓存(如 Redis)来确保防重复提交机制在多个节点上有效。

  • 用户体验: 适当的 interval 值设置对于用户体验非常重要。如果设置的间隔时间过长,可能会影响用户的操作体验;过短则可能无法有效防止重复提交。

# 五、总结

通过在接口方法上添加 @RepeatSubmit 注解,若依框架为开发者提供了一种简洁有效的防重复提交方案。该功能可以通过少量配置来避免用户在短时间内多次提交相同请求,从而防止数据的重复处理和不一致。

  • 简洁易用: 只需在方法上添加 @RepeatSubmit 注解,即可轻松实现防重复提交功能。
  • 高可定制性: 可以根据需求自定义防重复提交的时间间隔和提示信息。
  • 高效防护: 有效避免了用户多次提交相同请求,确保系统数据的一致性和完整性。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
系统接口文档生成
国际化支持

← 系统接口文档生成 国际化支持→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式