前端防重:
1.请求完之后,按钮置灰,等到返回结果再修改
2.请求完之后进行重定向到成功页面(防止刷新提交和按钮重复提交)
后端防重
1.幂等性操作,使用数据库设置唯一标识来解决,相当于把防重的操作交给了数据库,来处理,这种方式避免了垃圾数据入库,表单重复提交问题,但是增加了数据库的压力一定程度来书是不太合理的,唯一性是数据库本生该有的设计,这个一般作为最后一道防线。
2.session方法实现,每次提交一次请求前(或者登录时候生成一个,然后后面每次提交一次就使用,再生成一个返回,这样保证用户的session都有这一个标识。),先调用后端接口获取到一个唯一标识,这个标识前端session隐藏,等到提交表单时候传入这个标识,之后清楚session,如果重复提交,校验唯一标识存在则保存失败
别人解释:
在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。
3.直接加锁,为了避免短时间的重复提交,使用。这种方式只能在限制固定时间内的操作,当然最好还得加数据库唯一标识作为兜底
我最终的解决方案是使用redis实现:key生成策略(怎么保证唯一很重要),存活时间,缓存策略(redis还是本地map)具体代码如下:
注解Resubmit
/**
* 防重复提交拦截的注解
* @author ggy
* @date 2021/12/9
*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Resubmit {
/**
* 默认提交的0-表示前一

这篇博客详细介绍了如何使用Redis实现前后端的防重复提交策略。前端通过请求后禁用按钮和重定向来防止重复提交,后端则采用幂等性操作和Session方法确保数据一致性。最后,博主提出了一种使用Redis的解决方案,通过设置唯一标识并利用Redis锁机制,有效防止短时间内重复提交,确保操作的唯一性。代码示例展示了注解的定义、AOP切面的实现以及获取唯一键的方法。
最低0.47元/天 解锁文章
1197

被折叠的 条评论
为什么被折叠?



