使用Redis来防止Spring Boot应用中的接口被重复提交的完整示例代码。这个示例中,我们将创建一个简单的控制器,用于处理表单提交请求,并确保同一个用户在一定时间内不能重复提交同一个表单。
首先,确保你的Spring Boot项目中已经添加了Redis依赖。在pom.xml
中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
接下来,配置Redis连接信息。在application.properties
或application.yml
中添加Redis服务器的连接配置:
# application.properties
spring.redis.host=localhost
spring.redis.port=6379
现在,我们可以在控制器中使用Redis来防止接口被重复提交。以下是一个简单的示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/submit")
public class SubmissionController {
@Autowired
private StringRedisTemplate<String, String> stringRedisTemplate;
private static final String PREFIX = "submitLock";
@PostMapping("/form")
public String submitForm(@RequestParam("userId") String userId,
@RequestParam("formId") String formId) {
// 创建一个唯一的锁标识,例如用户ID和表单ID的组合
String lockKey = PREFIX + ":" + userId + ":" + formId;
// 尝试获取锁,如果锁不存在,则设置锁并执行业务逻辑
if (stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "locked", 300, TimeUnit.SECONDS)) {
try {
// 执行表单提交的业务逻辑...
// ...
// 提交成功后,返回相应信息
return "Form submitted successfully!";
} finally {
// 释放锁,以便其他请求可以继续执行
stringRedisTemplate.delete(lockKey);
}
} else {
// 如果锁已存在,表示表单已提交过或正在提交中
return "Form submission is already in progress or has been submitted recently!";
}
}
}
在这个示例中,我们首先定义了一个锁的前缀PREFIX
,然后创建了一个基于用户ID和表单ID的唯一锁键lockKey
。我们使用setIfAbsent
方法尝试在Redis中设置这个锁,如果设置成功,表示当前没有其他请求持有这个锁,我们可以安全地执行业务逻辑。
一旦业务逻辑执行完毕,我们使用finally
块来确保锁被释放,这样其他等待的请求就可以继续执行了。
请注意,这个示例中的锁过期时间设置为300秒,这意味着用户在5分钟内不能重复提交同一个表单。你可以根据实际需求调整这个过期时间。
这个示例假设你已经有了一个配置好的Redis服务器,并且Spring Boot应用能够连接到这个服务器。同时,你需要确保StringRedisTemplate
已经被注入到控制器中。