一、前言
在某些情况下,由于网络不佳,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现请求重复提交,造成数据库保存多条重复数据。
那么如何防止请求重复提交呢?一般有两种解决方案:
第一种:前端处理,在提交完成之后,将按钮禁用。
第二种:后端处理,使用拦截器拦截。
交给前端解决,判断多长时间内不能再次点击按钮,或者点击之后禁用按钮,当然,聪明的小伙伴能够绕过前端验证,因此推荐后端进行拦截处理。
二、实现思路
使用拦截器防止请求重复提交,其实若依早已整合,利用 AOP 切面在进入方法前拦截,通过 Redis 的 key-value 键值对存储,指定 key+url+消息头 来拼成字符串组成 key,使用 请求参数+时间 封装 map 对象赋值 value,当 key 不存在时,则为新的请求;若存在,则对请求参数以及请求的间隔时间进行判断是否重复提交。
三、使用教程
在接口方法上添加 @RepeatSubmit
注解即可,注解参数说明:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
interval | int | 5000 | 间隔时间(ms),小于此时间视为重复提交 |
message | String | 不允许重复提交,请稍后再试 | 提示消息 |
示例1:采用默认参数
@RepeatSubmit
public AjaxResult addSave()
{
return AjaxResult.success();
}
示例2:指定防重复时间和错误消息
@RepeatSubmit(interval = 1000, message = "请求过于频繁")
public AjaxResult addSave()
{
return AjaxResult.success();
}