使用 laravel 的 csrf 保护机制,确保表单包含 @csrf 并正确配置中间件;2. 实施一次性令牌模式,生成并校验唯一 Token 防止重复提交;3. 利用缓存系统如 redis 创建短暂锁机制,阻止相同请求短时间重复执行;4. 前端通过 javaScript 禁用提交按钮并添加 loading 提示,减少误操作;5. 在数据库层面设置唯一约束与事务控制,使用唯一索引和 firstOrCreate 方法保障数据一致性。

如果您在使用 Laravel 构建 Web 应用时发现用户可以多次提交相同的表单数据,可能会导致数据库重复记录或业务逻辑异常。这种情况通常发生在用户快速多次点击提交按钮或网络延迟时。以下是几种有效的防护措施来避免表单的重复提交。
本文运行环境:macbook Pro,macos Sonoma
一、使用 Laravel 的 CSRF 保护机制
Laravel 默认为每个活跃用户的会话提供一个 CSRF(跨站请求伪造)令牌,该令牌用于验证请求是否来自合法的客户端。启用 CSRF 保护可以在一定程度上防止恶意脚本自动重复提交表单。
1、确保在表单中包含 @csrf 指令,生成隐藏的 CSRF 字段。
2、必须在所有 POST、PUT、PATCH 和 delete 表单中添加 @csrf,否则请求将被中间件拒绝。
3、检查 app/http/Middleware/VerifyCsrfToken.php 是否正确注册到 web 中间件组。
二、一次性令牌(Token Redirection)模式
通过在表单中加入唯一的一次性令牌,并在服务器端进行校验和销毁,可有效防止同一表单被重复提交。此方法结合会话机制实现幂等性控制。
1、在显示表单时生成一个唯一的 token 并存入 session,例如使用 Str::random(40) 生成。
2、将该 token 作为隐藏字段嵌入表单,名称如 form_token。
3、提交时验证 session 中是否存在该 token,若不存在则拒绝请求。
4、验证通过后立即从 session 中删除该 token,确保无法再次使用。
三、利用缓存系统实现请求去重
借助 Laravel 的缓存功能(如 Redis 或 memcached),可以为每个用户+表单类型+参数组合创建短暂的锁机制,防止短时间内重复提交相同内容。
1、在处理表单的控制器方法中,构造一个唯一的缓存键,如 ‘form_lock_’ . md5($request->ip() . $request->fullUrl() . serialize($request->all()))。
2、使用 Cache::add() 尝试写入一个有效期较短的标记(例如 10 秒)。
3、如果 add 返回 false,说明该请求已存在,应直接返回错误或提示信息。
4、只有当缓存未命中时才继续执行业务逻辑。
四、前端 javascript 控制提交行为
虽然服务端防护是必须的,但前端限制也能提升用户体验,减少无效请求。通过禁用提交按钮或设置防抖机制,可降低误操作引发的重复提交概率。
1、在用户首次点击提交按钮后,立即将其设为 disabled 状态。
2、使用 JavaScript 添加 loading 提示,告知用户正在处理中。
4、避免仅依赖前端控制,始终配合后端验证。
五、使用数据库唯一约束与事务控制
对于某些关键业务场景(如订单创建、支付请求),即使前面有防护,仍需在数据层设置兜底策略。通过唯一索引和数据库事务确保数据一致性。
1、识别可能导致重复的数据字段,如用户 ID + 时间戳 + 业务类型组合。
2、在数据库表中为这些字段建立唯一索引。
3、在插入前使用 Laravel 的 firstOrCreate 方法或尝试捕获 QueryException 异常。
4、当检测到唯一键冲突时,返回已有记录而非创建新条目。
以上就是laravel怎么防止重复提交表单_laravel重复提交表单防护方法的详细内容,更多请关注php中文网其它相关文章!


