Laravel中POST路由实现搜索并防止页面刷新重复提交
解决POST搜索表单重复提交问题(PRG模式实践)
嘿,这个重复提交的问题在Web开发里太常见了,咱们用**PRG模式(Post-Redirect-Get)**就能完美搞定——这是业界解决这类问题的经典方案,核心逻辑很简单:用户提交POST表单后,服务器不直接返回结果视图,而是重定向到一个GET路由;浏览器收到重定向指令后会发送GET请求获取结果页面,这样刷新页面时只会重复GET请求,不会再次提交POST表单了。
下面一步步修改你的代码:
1. 修改POST控制器方法,改为重定向
把原来直接返回视图的逻辑,改成重定向到新的GET路由,同时把搜索参数存在session闪存里:
public function src_fn() { $para = Input::get('txt_pro_id'); // 重定向到GET结果路由,用with()把参数存在session一次性闪存中 return redirect()->route('search.results')->with('search_param', $para); }
2. 新增GET路由和对应的控制器方法
首先在路由文件里添加GET路由,专门负责展示搜索结果:
// 原POST路由:仅接收表单提交,不返回视图 Route::post('findsresult', 'SearchController@src_fn')->name('findsresult'); // 新增GET路由:负责查询并展示搜索结果 Route::get('search-results', 'SearchController@showResults')->name('search.results');
然后在SearchController里新增showResults方法,处理查询逻辑并返回视图:
public function showResults() { // 从session中取出搜索参数(with()存的是一次性闪存数据) $para = session('search_param'); // 处理无参数的情况(比如用户直接访问/search-results路由) if (!$para) { // 可以跳回搜索页,或者返回空结果列表 return redirect()->route('your.search.form.route'); // 替换成你搜索页的实际路由名 } // 执行数据库查询 $result = DB::table('testing_tbl')->where('pro_id', '=', $para)->paginate(5); // 返回结果视图,同时把搜索参数传给视图(方便表单回显关键词) return View::make('searchome') ->with('result', $result) ->with('search_param', $para); }
3. 优化搜索表单(可选,提升用户体验)
如果你的searchome视图里也有搜索表单,可以让它自动填充之前的搜索关键词,用old()或者传入的search_param:
<form method="post" action="{{route('findsresult')}}" name="frm_srch" role="search"> {!! csrf_field() !!} <input type="Text" name="txt_pro_id" id="txt_pro_id" value="{{ old('txt_pro_id', isset($search_param) ? $search_param : '') }}"> <input type="Submit" value="OK"> </form>
为什么这样能解决重复提交?
原来的逻辑是:POST提交后服务器直接返回视图,浏览器会把这次POST请求保存在历史记录里。当用户刷新页面时,浏览器会重新发送相同的POST请求,导致重复提交。
用PRG模式后:POST提交→服务器返回302重定向→浏览器发送GET请求获取结果页。此时浏览器的历史记录里是GET请求,刷新页面只会重新发送GET请求,而GET请求是幂等的(不会修改服务器数据),自然就不会出现重复提交的问题了。
内容的提问来源于stack exchange,提问作者The Rock
相关产品推荐
相关产品推荐

