防重复提交实现
# 防重复提交实现
在Web应用开发中,防止用户短时间内多次提交相同请求是非常重要的。为了避免重复提交导致的数据处理问题,若依框架提供了一个简单而有效的防重复提交机制。通过在接口方法上添加 @RepeatSubmit
注解,可以轻松实现防重复提交功能。本文将详细介绍该功能的使用方法及其实现细节。
# 一、@RepeatSubmit
注解参数说明
@RepeatSubmit
注解用于防止用户在短时间内多次提交相同请求。以下是该注解的参数说明:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
interval | int | 5000 | 间隔时间(毫秒),小于此时间视为重复提交。默认值为 5000 毫秒,即 5 秒。 |
message | String | 不允许重复提交,请稍后再试 | 当检测到重复提交时,返回的提示消息。 |
# 二、@RepeatSubmit
注解的使用示例
# 1. 采用默认参数防止重复提交
在接口方法上添加 @RepeatSubmit
注解,不指定任何参数时,将采用默认的防重复提交间隔时间 5000 毫秒(5 秒),并返回默认的提示消息。
import com.ruoyi.common.annotation.RepeatSubmit;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* 用户管理控制器
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/user")
public class UserController {
/**
* 新增用户接口
*
* @param user 用户信息
* @return 操作结果
*/
@RepeatSubmit
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(User user) {
// 调用服务层逻辑处理
return success(userService.insertUser(user));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- 默认行为:
- 如果用户在 5 秒内再次提交相同请求,将返回默认的错误消息
"不允许重复提交,请稍后再试"
。
- 如果用户在 5 秒内再次提交相同请求,将返回默认的错误消息
# 2. 指定防重复时间和错误消息
在某些场景下,可能需要自定义防重复提交的间隔时间和错误消息。可以通过设置 interval
和 message
参数来实现。
import com.ruoyi.common.annotation.RepeatSubmit;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* 订单管理控制器
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/order")
public class OrderController {
/**
* 新增订单接口
*
* @param order 订单信息
* @return 操作结果
*/
@RepeatSubmit(interval = 1000, message = "请求过于频繁,请稍后再试")
@PostMapping("/add")
@ResponseBody
public AjaxResult addOrder(Order order) {
// 调用服务层逻辑处理
return success(orderService.insertOrder(order));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- 自定义行为:
- 如果用户在 1 秒(1000 毫秒)内再次提交相同请求,将返回自定义的错误消息
"请求过于频繁,请稍后再试"
。
- 如果用户在 1 秒(1000 毫秒)内再次提交相同请求,将返回自定义的错误消息
# 三、@RepeatSubmit
注解的实现逻辑
@RepeatSubmit
注解背后的实现逻辑是基于请求的唯一性标识和时间间隔判断。具体来说,以下是核心逻辑的概述:
请求标识生成:
- 在每次请求到达时,框架会生成一个唯一的请求标识(通常基于请求的URL、请求参数、用户ID等信息)。
请求时间存储:
- 每次请求到达时,系统会将请求标识与当前时间存储在缓存或会话中。
时间间隔判断:
- 当新的请求到达时,系统会检查该请求标识是否已经存在于缓存中。如果存在,则比较当前时间与上次请求时间的间隔。
重复请求处理:
- 如果请求的时间间隔小于注解中定义的
interval
时间,则视为重复提交,返回指定的message
提示信息。
- 如果请求的时间间隔小于注解中定义的
正常请求处理:
- 如果时间间隔超过了定义的
interval
,则认为是正常请求,继续处理并更新缓存中的时间记录。
- 如果时间间隔超过了定义的
# 四、防重复提交的注意事项
缓存管理: 防重复提交的实现依赖于缓存技术,需要根据实际情况选择合适的缓存方案(如 Redis、Ehcache 等)。需要确保缓存的稳定性和高可用性。
分布式场景: 在分布式系统中,需要考虑不同节点之间的请求同步问题。可以使用分布式缓存(如 Redis)来确保防重复提交机制在多个节点上有效。
用户体验: 适当的
interval
值设置对于用户体验非常重要。如果设置的间隔时间过长,可能会影响用户的操作体验;过短则可能无法有效防止重复提交。
# 五、总结
通过在接口方法上添加 @RepeatSubmit
注解,若依框架为开发者提供了一种简洁有效的防重复提交方案。该功能可以通过少量配置来避免用户在短时间内多次提交相同请求,从而防止数据的重复处理和不一致。
- 简洁易用: 只需在方法上添加
@RepeatSubmit
注解,即可轻松实现防重复提交功能。 - 高可定制性: 可以根据需求自定义防重复提交的时间间隔和提示信息。
- 高效防护: 有效避免了用户多次提交相同请求,确保系统数据的一致性和完整性。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08