当前位置: 首页 > news >正文

SpringBoot防止重复提交(2)

例如:多次点击提现按钮

 问题描述:

        在提现操作中,用户可能会多次点击提现按钮,导致多个相同的请求发送到服务器,从而引发重复提现的问题。为了解决这一问题,必须保证每个提现请求只能执行一次,防止重复提交操作。

两种常见的解决方案

方案 1:基于浏览器页面打开的时候生成 Token

实现步骤:
  1. 生成唯一提现票据(Token)

    • 逻辑:当用户进入提现页面时,后端生成一个唯一的 Token(如 UUID)。该 Token 会被存储到 Redis 中,并设置较短的有效期(如 5 秒)。

    • 返回给前端:后端将该 Token 返回给前端,前端每次提交提现请求时,必须携带该 Token

  2. 校验 Token

    • 逻辑:每次提现请求时,后端会校验请求中的 Token 是否存在且未过期。

      • 如果 Token 不存在已失效,后端直接返回 "重复请求" 错误信息,拒绝继续处理。

      • 如果 Token 存在且未过期,后端继续处理提现请求,并将该 Token 从 Redis 中删除,防止重复提交。

适用场景
  • 适用于防止用户短时间内多次点击提现按钮的场景。

  • Token 的有效期较短,适用于需要快速防止重复请求的情况。

优点
  • 简单易实现:只需在后端生成并校验 Token,通过短期有效的 Token 快速避免重复请求。

  • 避免短时间内的重复提交:有效防止用户因误操作或延迟导致的多次请求。

缺点
  • 有效期短:如果用户在 5 秒(或设置的短期有效期内)没有再次点击提现,Token 会失效,导致无法继续提交请求。

  • 用户体验差:若用户长时间未操作,Token 会过期,需要重新获取新的 Token。此时,如果用户未刷新页面,可能会导致不必要的操作中断,影响用户体验。

假如说,如果遇到下面的问题呢:
  • 用户在 5 分钟未点击操作,或者第一次点击后 5 分钟没有刷新页面,之后再次点击会失败。由于 Token 已过期,系统会认为是重复请求,导致用户无法继续提现。


方案 2:基于首次点击按钮才生成 Token ,并存储于前端

实现步骤:
  1. 生成并存储 Token

    • 逻辑:当用户首次点击提现按钮时,后端生成一个唯一的 Token,并存储到 Redis 中(例如:5秒)。

    • 返回给前端:后端将该 Token 返回给前端,前端将其存储在浏览器(如 localStoragesessionStorage或者请求头)中。

  2. 后续请求验证 Token

    • 逻辑:每次用户点击提现按钮时,前端会从浏览器缓存中取出 Token,并将其作为请求的一部分传递给后端。

    • 后端校验 Token

      • 如果 Token 已存在,说明该请求是重复点击,拒绝继续执行,并提示用户:“您已提交提现请求,请等待处理”。

      • 如果 Token 不存在,说明是新的提现请求,后端重新生成并存储新的 Token,并继续处理提现请求。

适用场景
  • 适合长时间有效的操作场景,特别是用户可能在较长时间内未刷新页面的情况下,系统仍然能够处理提现请求。

  • 适用于长时间内防止重复提交问题。

优点
  • 避免 Token 过期问题:用户在打开浏览器页面后较长时间内可以随时提交提现请求,而不需要担心 Token 过期。

    • 因为不是打开页面创建的Token,是首次点击才创建Token

缺点
  • 依赖前端存储:需要依赖前端(如 localStoragesessionStorage)来存储 Token,如果用户清除浏览器缓存或者使用隐私模式,可能导致 Token 丢失。

  • 增加系统复杂度:需要保证前后端 Token 的同步,避免出现 Token 被滥用的情况。

http://www.dtcms.com/a/358755.html

相关文章:

  • day44-Ansible变量
  • 联合体和枚举——嵌入式学习笔记
  • 每日算法题【二叉树】:二叉树的最大深度、翻转二叉树、平衡二叉树
  • 【系统分析师】高分论文:论软件的系统测试及应用
  • 栈溢出问题
  • Redis-数据类型的常用操作命令
  • uart学习
  • Jdk动态代理 Cglib动态代理
  • MYSQL表结构优化场景
  • 解构机器学习:如何从零开始设计一个学习系统?
  • folium地图不显示加载不出来空白问题解决
  • SAP PP模块的MPS
  • 福彩双色球第2025100期篮球号码分析
  • git在push和clone等操作时显示‘: Invalid argument
  • 优选算法:二分查找
  • #5:Nginx核心使用技术
  • Java 学习笔记(基础篇12)
  • 小狼毫输入法中让数字键盘上的数字键不再选择候选词而是与原始输入一起直接上屏
  • 计算机视觉与深度学习 | 基于深度学习的图像特征提取与匹配算法综述及MATLAB实现
  • 互联网大厂大模型应用开发岗位面试:技术点详解与业务场景演练
  • nacos3端口漂移问题
  • shell编程-核心变量知识
  • LeetCode - 234. 回文链表
  • 2025年高性能计算年会
  • Golang 面试题「高级」
  • 零碳智慧园区双碳方案
  • 代理IP网站哪家好?全球优质IP代理服务商有什么推荐?
  • 【Linux】网络安全管理:Netfilter、nftables 与 Firewalld | Redhat
  • Linux查看Java进程PID、端口号和内存占用脚本
  • 2023年山东省信息学小学组(CSP-X)第一轮题解