Laravel如何防止页面刷新时表单重复提交?
解决Laravel页面刷新表单重复提交问题
嘿,你这情况明显是Post/Redirect/Get(PRG)模式没用到点子上!你说已经尝试重定向,但应该是处理完表单后直接返回视图了对吧?这就导致浏览器把POST请求存在历史里,一刷新就重复提交。我给你捋捋正确的实现方式:
第一步:调整控制器的处理逻辑
处理表单提交成功后,别直接return view()返回页面,而是用重定向,同时把提示信息存在session闪存里——这种闪存数据只会保留到下一次请求,刚好适合显示提交成功的提示:
public function store(Request $request) { // 这里放你的表单验证、数据入库逻辑... // 重定向到表单页面(替换成你实际的路由名/路径) return redirect()->route('admin.enrollform')->with('success', '表单提交成功!'); }
要是你没给路由命名,也可以用redirect('/admin/enrollform')或者redirect()->back(),不过用路由名更稳妥。
第二步:在视图里显示提示信息
打开admin.enrollform.blade.php,在表单上方加一段读取session提示的代码:
@if(session('success')) <div class="alert alert-success"> {{ session('success') }} </div> @endif <!-- 你的表单代码 --> <form method="POST" action="{{ route('admin.enrollform.store') }}"> @csrf <!-- 你的表单字段 --> <button type="submit">提交</button> </form>
为啥这样就能解决问题?
当表单提交成功后,控制器返回的是302重定向响应,浏览器收到后会自动发一个GET请求去加载表单页面。这时候浏览器的历史记录里存的是GET请求,刷新页面只会重新加载这个GET请求,不会再触发表单提交啦!至于提示信息,因为存在session闪存里,第一次加载GET页面时会显示,刷新后闪存数据就消失了——要是你希望刷新后还能看到提示,把with()换成session()->put()就行,不过一般提交成功的提示看一次就够了对吧?
额外提醒
- 记得表单提交的路由用POST方法,表单页面的路由用GET方法,这是Laravel里RESTful的标准玩法,别搞混了。
- 之前你直接返回视图的做法(比如
return view('admin.enrollform')->with('success', '...')),就是导致刷新重复提交的根源,一定要改成重定向哦!
这样调整完,刷新页面就只会重新加载表单,再也不会重复提交啦😉
内容的提问来源于stack exchange,提问作者fractal5
相关产品推荐
相关产品推荐

