使用redis实现防重-数据重复提交

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

前端防重:

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-表示前一
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值