首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏JAVA乐园

    实现重复提交重复点击

    点击上方「蓝字」关注我们 0x01: 背景 同一条数据被用户点击了多次,导致数据冗余,需要防止弱网络等环境下的重复点击 0x02: 目标 通过在指定的接口处添加注解,实现根据指定的接口参数来重复点击 0x03: 说明 这里的重复点击是指在指定的时间段内多次点击按钮 0x04: 技术方案 springboot + redis锁 + 注解 使用 feign client 进行请求测试 0x05 :实战演练 1、根据接口收到 PathVariable 参数判断唯一 /** * 根据请求参数里的 PathVariable 里获取的变量进行接口级别重复点击 * * } 2、根据接口收到的 RequestBody 中指定变量名的值判断唯一 /** * 根据请求参数里的 RequestBody 里获取指定名称的变量param5的值进行接口级别重复点击 java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * TestControllerTest * @description 重复点击测试类

    2.9K41发布于 2020-10-19
  • 来自专栏java

    SpringBoot接口抖(重复提交)的一些实现方案

    前言啥是抖思路解析分布式部署下如何做接口抖?具体实现请求锁唯一key生成重复提交判断前言作为一名老码农,在开发后端Java业务系统,包括各种管理后台和小程序等。 啥是抖 所谓抖,一是用户手抖,二是网络抖动。在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。 如何确定接口是重复的?抖也即重复提交,那么如何确定两次接口就是重复的呢? 首先,我们需要给这两次接口的调用加一个时间间隔,大于这个时间间隔的一定不是重复提交;其次,两次请求提交的参数比对,不一定要全部参数,选择标识性强的参数即可;最后,如果想做的更好一点,还可以加一个请求地址的对比 第一次提交,"添加用户成功"短时间内重复提交,"BIZ-0001:您的操作太快了,请稍后重试"过几秒后再次提交,"添加用户成功"从测试的结果上看,抖是做到了,但是随着缓存消失、锁失效,还是可以发起同样的请求

    97400编辑于 2024-09-12
  • 来自专栏Java实战博客

    后端重复提交的方案

    什么是重复提交。(张三买裤子这个场景) 张三下单买一条黑色的型号是AA的裤子,点击下单的时候,卡了一下,半天不出来,暴躁张三连续点击了10下,于是后台识别为:张三下单买一条黑色的型号是AA的裤子。 张三实际只要1条裤子,这就是重复提交。 如何识别重复提交 可以获取用户账号、请求资源、请求参数。 解决方案 重复提交有两种环节实现。 在请求入口限制 后端服务入口限制。

    35210编辑于 2023-09-02
  • 来自专栏Java技术栈

    Spring MVC表单重复提交

    利用Spring MVC的过滤器及token传递验证来实现表单重复提交。 create() default false; boolean remove() default false; } 在跳转页面的方法上加上:@Token(create = true)\ 在提交的 remove) { if (isRepeatSubmit(request)) { logger.warn("表单不能重复提交 {session.getAttribute('token')}"/> 在form表单里面添加token域,提交表单时需要传过去。

    2K60发布于 2018-03-30
  • 来自专栏编程技术

    SpringBoot接口抖大作战,拒绝“手抖”重复提交

    一、什么是接口抖?想象一下这个场景:用户小张在提交订单时,因为网络延迟,他以为没点中那个“提交”按钮,于是疯狂连击了10次!结果…10个一模一样的订单诞生了! 接口抖 就像是给按钮加上了一层“冷静期”——“兄弟,你点太快了,先冷静3秒再说!”防止重复提交 则是更严格的保安大哥——“同样的身份证(请求)只能进一次,想蒙混过关?没门!” 下面我来教你在SpringBoot中布下天罗地网,拦截这些“手抖攻击”! SpEL表达式 */ String key() default ""; /** * 提示信息 */ String message() default "请勿重复提交 * @param key 请求唯一标识 * @return true=重复提交, false=首次提交 */ public boolean isDuplicate(String

    17810编辑于 2026-03-17
  • 来自专栏程序员备忘录

    Curator学习笔记(二)- 重复提交

    根据了解,我们可以使用curator的读写锁来做一个分布式重复提交的策略。为什么采用curator来做这个事情的原因是curator提供的读写锁能够跨线程和jvm进行加锁。 如果不加锁,那么因为网络抖动或者线程切换,谁都不知道重复提交的token标志是否被其他请求修改。因此这块必然要采用加锁的方式。 对于放重复提交的一般规则来说,我无非就是将session提取出来,而session则是和用户绑定的,因此这块我们将userId作为放重复提交的判断标志,将token表示该用户下次提交的表单的有效token } 测试代码 @RestController @RequestMapping(value = "/zklock") public class TestLock { /** * 重复提交 return ResponseResult.error(newToken); } } } 在浏览器中发送请求: 一些反思:通过逻辑分析,这里做的重复提交的工具适合做单个有序接口

    54610编辑于 2022-08-11
  • 来自专栏开源技术小栈

    如何订单重复提交策略方法

    但前端的限制仅能解决少部分问题,且不够彻底,后端自有的重复处理措施必不可少,义不容辞。 在接口实现中,我们常要求接口要满足幂等性,来保证多次重复请求时只有一次有效。 比如第三方支付前台回调和后台回调,第三方支付批量回调,慢性能业务逻辑(如用户提交退款申请,商家同意退货/退款等)或慢网络环境时,是重复处理的高发场景。 ### 尝试 这里针对“用户提交退款申请”的例子,说明一下尝试过的重复处理方法的效果。 后端重复处理的方式,我们先后尝试了三种: #### (1)基于DB中退款订单状态的验证 这种方式简单直观,从DB查询出来的退款详情(包括状态)往往还可以用在后续逻辑中,没有花额外的工作专门应对重复请求的问题 但对于重复处理效果并不好:在前端添加重复提交前,每周平均在25笔;前端优化后,每周降到7笔。这个数量占总退款申请数的3%%,一个仍然无法接受的比例。

    2.4K01发布于 2018-09-24
  • 来自专栏IT民工的代码世界

    SpringBoot实现表单重复提交检测

    前言 在实际开发过程中,web应用经常会出现网络延迟,接口处理时间略长,用户习惯等原因造成的客户连续多次点击提交按钮调用接口,导致数据库会出现重复数据或这接口业务逻辑bug等问题 方案 利用redis 锁实同一个用户同一个请求2秒内重复提交返回错误路由 SubmitLock 标记需要拦截的方法 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME System.out.println("tryLock fail, key = ["+key+"]"); return Result.errorResult().setMsg("重复请求

    64320编辑于 2023-07-19
  • 来自专栏友儿

    (抖) 前后端重复提交常用的那些方法

    抖(Debounce)是一种防止重复提交的策略,它通过延迟一定时间来合并连续的操作,以确保只执行一次。 // 清除会话中的 token unset($_SESSION['submit_token']); } Token抖(利用随机生成的 token 来防止重复提交) $token = md5( == $lastSubmitIP) { // 处理表单提交 $_SESSION['last_submit_ip'] = $userIP; } Cookie抖 (利用Cookie来防止在一段时间内的重复提交 ); // 60秒内不允许重复提交 } 延时抖(在最后一次操作后的一段时间内,只执行一次提交操作) if (! cache_get($cacheKey)) { // 处理表单提交 cache_set($cacheKey, 'submitted', 60); // 60秒内不允许重复提交 } 验证码抖(要求用户输入特定的验证码来提交表单

    1.3K20编辑于 2023-10-21
  • 来自专栏FHADMIN

    SpringBoot Redis 解决重复提交问题

    按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重复处理。如何保证其幂等性,通常有以下手段: 1、数据库建立唯一性索引,可以保证最终插入数据库的只有一条数据。 2、引入springboot中到的redis的stater,或者Spring封装的jedis也可以,后面主要用到的api就是它的set方法和exists方法,这里我们使用springboot的封装好的redisTemplate postman请求,首先访问get/token路径获取到具体到token: 利用获取到到token,然后放到具体请求到header中,可以看到第一次请求成功,接着我们请求第二次: 第二次请求,返回到是重复性操作 ,可见重复性验证通过,再多次请求到时候我们只让其第一次成功,第二次就是失败:

    1.2K30编辑于 2021-12-20
  • 来自专栏程序员备忘录

    Curator学习笔记(三) - zk重复提交2.0版

    前几天,说要用curator的读写锁写一个分布式重复提交的工具包。然后今天作者就探索一下,在上次文章的末尾,作者说当时的这种方式解决不了大量表单使用相同的重复提交token上送。 其他都可能被视为重复的表单。但是作者后边想了想感觉这种情况还是比较少。很多时候表单都是单个提交的。所以我们先不考虑那种情况,因为如果考虑那种情况会比较复杂。 交由spring管理 DoubleSubmitAdvice 是对请求重复提交token的生成处理。 reSubmitLock.check(userId, token)) { logger.warn(MessageFormat.format("重复提交的表单 status) { System.out.println("不能重复提交表单"); } return status; } /**

    37020编辑于 2022-08-11
  • 来自专栏开发经验

    Java 开发实例:Spring Boot+AOP+注解+Redis重复提交抖)

    在现代Web应用中,防止重复提交是一个常见的需求。重复提交可能会导致数据一致性问题,例如重复的订单生成、数据多次插入等。 本文将介绍如何使用Spring Boot、AOP、注解和Redis来实现重复提交抖)功能。 1. 创建重复提交注解 首先,创建一个自定义注解@NoRepeatSubmit,用于标识需要重复提交的方法: package com.example.demo.annotation; import java.lang.annotation.ElementType 总结 本文详细介绍了如何使用Spring Boot、AOP、注解和Redis实现重复提交抖)功能。 通过自定义注解和AOP切面,我们能够方便地为指定的接口添加重复提交功能,避免数据重复插入等问题。

    93910编辑于 2025-06-01
  • 来自专栏从零开始学自动化测试

    python测试开发django-162.ajax 提交表单,重复提交(beforeSend)

    前言 form 表单提交的时候,当快速点击提交按钮的时候,会触发多个请求过去,会导致重复添加。 前端页面 前端form表单页面,2个输入框,一个提交按钮 <form id="form" action="" method="post" class="form-horizontal" role="form ">

    </form> 这里用ajax提交请求 <script> /** 定义表单提交事件 */ function project_save (); }) </script> 遇到问题,当快速点提交按钮多次,会触发多个请求 beforeSend 禁用添加按钮 解决办法,在点提交按钮,发请求之前,可以调用beforeSend 方法,添加一个disabled :"+e); } }); } 这样就能解决快速点击,导致前端页面重复提交的问题 complete 完成请求 一般在 beforeSend 发请求之前禁用提交按钮

1.8K10发布于 2021-11-05
  • 来自专栏Reset

    自定义注解实现重复提交(纯后端解决)

    RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface RepeatSubmit { /** * 重复提交间隔时间 */ int time() default 3000; String msg() default "请勿重复提交"; } 创建访问的资源路径 @RestController

    85710编辑于 2022-12-27
  • 来自专栏Java大联盟

    SpringBoot+Redis 解决海量重复提交问题

    按照这个含义,最终的含义就是 对数据库的影响只能是一次性的,不能重复处理。如何保证其幂等性,通常有以下手段: 1、数据库建立唯一性索引,可以保证最终插入数据库的只有一条数据。 2、引入springboot中到的redis的stater,或者Spring封装的jedis也可以,后面主要用到的api就是它的set方法和exists方法,这里我们使用springboot的封装好的redisTemplate 第二次请求,返回到是重复性操作,可见重复性验证通过,再多次请求到时候我们只让其第一次成功,第二次就是失败: ? 总结 本篇介绍了使用springboot和拦截器、redis来优雅的实现接口幂等,对于幂等在实际的开发过程中是十分重要的,因为一个接口可能会被无数的客户端调用,如何保证其不影响后台的业务处理,如何保证其只影响数据一次是非常重要的

    3.3K20发布于 2020-04-22
  • 来自专栏源哥的专栏

    防止重复提交

    提交form数据,假如提交的按钮是图片按钮而不是submit按钮,可以按下面方法防止按钮被多次提交: 1. ----------------------------------------------- script language="javascript"> var flag=false; dosubmit() {    if (flag==true)    {       alert("傻比你已提交过了

    2.3K10发布于 2018-08-28
  • 来自专栏全栈程序员必看

    springmvc防止重复提交_java后端解决重复提交问题

    表单提交时需要校验数据是否已存在,如果已存在需要防止重复提交,做法比较简单,不再赘述。

    1.9K20编辑于 2022-11-11
  • 这样的接口幂等实现我认为最为优雅(重复提交)

    什么是重复提交 重复提交是指用户在短时间内多次发送相同的请求或提交相同的数据,导致服务器多次处理该请求,可能会引发一系列问题。 重复提交的影响 数据重复:例如,在电商平台上重复提交订单可能会导致用户购买同一商品多次,从而产生多个重复的订单。 资源浪费:服务器需要处理多次相同的请求,消耗了不必要的计算资源。 用户体验差:用户可能会感到困惑或不满,尤其是在重复提交导致数据错误或需要额外操作来取消重复的请求时。 数据不一致:重复提交可能会导致数据库中出现不一致的数据,例如多次插入相同的记录。 重复提交前端解决 按钮禁用 按钮禁用是防止重复提交的常见且简单的方法之一,主要通过在用户点击提交按钮后,立即禁用按钮或隐藏按钮,使用户无法再次点击,从而避免多次提交相同请求。 错误处理:确保在提交失败时,按钮能够恢复可点击状态,并提示用户重新提交。 通过这些实践,可以有效减少重复提交的问题,并改善用户体验。

    96310编辑于 2025-05-31
  • 来自专栏知了一笑

    架构设计 | 接口幂等性原则,重复提交Token管理

    GET:用于获取资源,不应有副作用,所以是幂等的; POST:用于创建资源,重复提交POST请求可能产生两个不同的资源,有副作用不满足幂等性; PUT:用于更新操作,重复提交PUT请求只会对其URL中指定的资源有副作用 支付前系统本地相关业务处理 ; 请求第三方支付服务执行扣款; 第三方支付返回处理结果; 本地服务基于支付结果响应客户端; 该业务流程中要处理相当复杂的问题,比如事务,分布式事务,接口延迟超时,客户端重复提交等等 BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT '订单id', `token_id` VARCHAR (50) DEFAULT NULL COMMENT '重复提交 ,订单是不能重复提交的,下面会演示如何控制,这里业务是执行后推到完成,也可能业务向前清理,把整个流程置为失败,这里涉及关键状态判断,要选取一个状态作为成功或失败的标识,判断后续操作流程。 三、接口重复提交 1、表单重复提交 在实际情况中,接口如果处理时间过长,用户可能会点击多次提交按钮,导致数据重复

    1.9K50发布于 2020-05-28
  • 来自专栏全栈程序员必看

    表单提交原理_防止表单重复提交

    1.HTTP是如何提交表单的 <form>标签的属性enctype设置以何种编码方式提交表单数据。 2.文件标签 <input type=”file” name=”myfile”>标签用来提交文件。要注意的是,这个标签的value值并不是所选择的文件内容,而是这个文件的完整路径名。 正如前面所说的,表单在提交表单时,如果采用默认编码方式,文件的内容是不会被提交的。要提交文件内容要采用multipart/form-data编码方式,这需要在服务器端从提交的二进制流中读取文件内容。 Content-Disposition: form-data; name=”buttom” 上传 ——WebKitFormBoundaryQqpAxgR2Pgik6uyY– 可以看到提交的表单数据是混合了所有请求参数的数据

    7.6K20编辑于 2022-11-08
  • 领券