在 Spring Boot 与 Thymeleaf 结合的 Web 应用中,防止重复提交可以采用token 机制 + 客户端禁用按钮
的方式实现,在高并发场景下,考虑使用 Redis 存储 token 而非 Session。
第一步:后端实现
java
@Controller
public class FormController {
@GetMapping("/form")
public String showForm(Model model) {
// 生成唯一 token 并存入 session
String token = UUID.randomUUID().toString();
model.addAttribute("token", token);
return "form";
}
@PostMapping("/submit")
public String handleSubmit(@RequestParam("token") String token,
HttpSession session) {
// 验证 token
if (!isValidToken(token, session)) {
throw new RuntimeException("重复提交或无效 token");
}
// 处理表单数据...
// 移除已使用的 token
session.removeAttribute("token");
return "success";
}
private boolean isValidToken(String token, HttpSession session) {
// 实现 token 验证逻辑
return token != null && token.equals(session.getAttribute("token"));
}
}
第二步:前端实现 (Thymeleaf)
html
<form th:action="@{/submit}" method="post">
<!-- 其他表单字段 -->
<input type="hidden" th:value="${token}" name="token" />
<button type="submit">提交</button>
</form>