当前位置:首页 > Java

java如何防止表单重复提交

2026-03-17 19:32:12Java

使用Token机制防止重复提交

在表单页面生成一个随机Token(如UUID),存储在Session或Redis中。提交表单时携带该Token,服务器验证后立即清除Token。若重复提交,Token已失效导致验证失败。

// 生成Token示例
String token = UUID.randomUUID().toString();
request.getSession().setAttribute("formToken", token);

// 验证Token示例
String sessionToken = (String) request.getSession().getAttribute("formToken");
if (sessionToken == null || !sessionToken.equals(request.getParameter("token"))) {
    return "error:重复提交";
}

前端按钮禁用技术

通过JavaScript在表单提交后立即禁用提交按钮,防止用户多次点击。可结合CSS设置禁用状态样式提升用户体验。

java如何防止表单重复提交

document.getElementById("submitBtn").addEventListener("click", function() {
    this.disabled = true;
    this.form.submit();
});

重定向模式(Post/Redirect/Get)

处理POST请求后返回302重定向至结果页面。浏览器刷新时只会重复GET请求,避免重复提交表单数据。Spring MVC中可通过redirect:前缀实现。

@PostMapping("/submit")
public String handleSubmit(Form form) {
    // 处理表单数据
    return "redirect:/success";
}

请求限流控制

对相同IP或用户ID的请求进行限流,例如使用Guava RateLimiter或Redis实现计数器。设置合理时间窗口(如5秒内只允许1次提交)。

java如何防止表单重复提交

// Guava限流示例
RateLimiter limiter = RateLimiter.create(1.0); // 每秒1次
if (!limiter.tryAcquire()) {
    throw new RuntimeException("操作过于频繁");
}

数据库唯一约束

对业务关键字段添加数据库唯一索引。如订单号字段设置UNIQUE约束,重复提交时会触发异常,可通过事务回滚处理。

ALTER TABLE orders ADD UNIQUE (order_no);

幂等性设计

为每个请求分配唯一ID(如雪花ID),服务端记录已处理ID。重复ID直接返回之前的结果。适用于支付等关键业务场景。

// 幂等检查伪代码
if (redis.exists(requestId)) {
    return redis.get(requestId);
} else {
    // 处理业务
    redis.setex(requestId, 3600, result);
}

分享给朋友:

相关文章

css表单制作

css表单制作

表单基础结构 使用HTML创建表单容器,包含<form>标签及输入字段。表单通常需要<input>、<label>、<textarea>等元素。…

php 实现表单验证

php 实现表单验证

表单验证基础方法 使用内置函数和条件判断进行基础验证,例如检查空值、长度限制等: $name = $_POST['name'] ?? ''; $email = $_POST['email'] ??…

vue实现表单收集

vue实现表单收集

Vue 表单收集实现方法 双向数据绑定(v-model) 使用 v-model 指令实现表单元素与 Vue 实例数据的双向绑定。适用于大多数表单控件类型。 <template> &l…

vue 实现动态表单

vue 实现动态表单

Vue 实现动态表单的方法 动态表单通常指表单字段可以动态增减或根据条件变化。以下是几种实现方式: 使用 v-for 动态渲染表单字段 通过数组存储表单字段数据,利用 v-for 动态渲染: da…

vue实现表单提交

vue实现表单提交

Vue 表单提交的实现方法 Vue 提供了多种方式实现表单提交,以下是常见的几种方法: 双向绑定(v-model) 使用 v-model 实现表单数据的双向绑定,通过方法处理提交逻辑: &…

vue实现流程表单

vue实现流程表单

Vue 实现流程表单的方法 使用动态组件实现步骤切换 在 Vue 中可以通过动态组件结合状态管理来实现流程表单的分步操作。定义一个父组件管理当前步骤,子组件处理各步骤的表单逻辑。 <templ…