一、前言
在某些情况下,由于网络不佳,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现请求重复提交,造成数据库保存多条重复数据。
那么如何防止请求重复提交呢?一般有两种解决方案:
第一种:前端处理,在提交完成之后,将按钮禁用。
第二种:后端处理,使用拦截器拦截。
交给前端解决,判断多长时间内不能再次点击按钮,或者点击之后禁用按钮,当然,聪明的小伙伴能够绕过前端验证,因此推荐后端进行拦截处理。
二、实现思路
使用拦截器防止请求重复提交,其实若依早已整合,利用 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();
}

文章介绍了如何防止Web应用中的请求重复提交问题,提出了前端禁用按钮和后端使用拦截器结合Redis进行AOP拦截的两种方案。推荐使用后端拦截处理,并提供了使用自定义注解@RepeatSubmit实现的示例,该注解允许指定间隔时间和错误提示信息来控制请求频率。

6258

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



