【问题标题】:Laravel 4: Prevent form re-submissionsLaravel 4:防止表单重新提交
【发布时间】:2013-07-24 07:48:36
【问题描述】:

我已经完成了这个question,但他们发布的答案并没有解决我的问题。

出现的问题是,如果用户点击浏览器的后退按钮返回到提交的表单,输入的数据仍然存在并且用户能够“重新提交”表单。 如何防止这种行为(laravel 的方式)?

我的 route.php 看起来像

Route::group(array('after' => 'no-cache'), function()
{
Route::get('/', 'HomeController@index');
Route::ANY('/search','HomeController@search');
Route::get('user/login',array('as'=>'user.login','uses'=>'UserController@getLogin'));
Route::post('user/login',array('as'=>'user.login.post','uses'=>'UserController@postLogin'));
Route::get('user/logout',array('as'=>'user.logout','uses'=>'UserController@getLogout'));
Route::post('user/update/{id}',array('as'=>'user.update','uses'=>'UserController@userUpdate'));
Route::group(array('before' => 'auth'), function()
{
    Route::get('user/profile',array('as'=>'user.profile','uses'=>'UserController@getUserRequest'));
    Route::get('order/checkout','OrderController@checkout');
    Route::get('order/status',array('as'=>'order.status','uses'=>'OrderController@orderStatus'));
    Route::group(array('before' => 'csrf'), function()
    {
        Route::post('order/process','OrderController@process');
    });

});
}); 

过滤器.php

Route::filter('csrf', function()
{

if (Session::token() != Input::get('_token'))
{
    throw new Illuminate\Session\TokenMismatchException;
}
});
Route::filter('no-cache',function($route, $request, $response){

    header("Cache-Control: no-cache,no-store, must-revalidate"); //HTTP 1.1
    header("Pragma: no-cache"); //HTTP 1.0
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

});

控制器代码

public function process(){        
    //data is saved to database
    Session::put('_token', md5(microtime())); 
    return Redirect::route('order.status');

}
public function orderStatus(){
    return View::make('orderStatus')->with('message','done');
}

【问题讨论】:

  • 您是说他们可以按后退按钮而只能“查看”表单 - 还是他们实际上可以使用您上面的代码第二次提交表单?
  • @TheShiftExchange 他们可以第二次提交表单。
  • 你确定你正在点击 process() 函数吗?我刚刚运行了您的代码 - 它有效 - 我无法提交两次。也许将 if (Session::token() != Input::get('_token')) 更改为 if (Session::token() != '44444') 并查看表单是否默认失败?也许路线没有被击中?
  • 能否请您发布您的“表单”视图文件?
  • 是的,它击中了 process() 函数。 here 是表单视图代码

标签: php laravel laravel-4


【解决方案1】:

换班:

您确定您的浏览器在按下时没有“刷新”页面 '返回' - 因为'无缓存'?试试这个:加载表单,查看 来源,看@隐藏的令牌代码。然后提交表格,按 回来,@看看隐藏的令牌代码——它们是一样的吗?

尝试Tobemyself Rahu:

不,它们不一样

那就是你的答案!当您按下“返回”时,您的浏览器正在“刷新”页面!

因此,您的代码适用于大多数浏览器 - 但无论您使用哪种浏览器都会自动刷新“背面”页面 - 因此您的令牌将重新填充到表单上。就像用户正在“重新访问”表单一样 - 所以你几乎无法阻止这种情况。它适用于大多数浏览器...

或者您可以关闭表单的“无缓存” - 或将其设置为 5 分钟或其他时间 - 这样浏览器就不会刷新页面。

也许有一个“表单”缓存过滤器 - 5 分钟和一个用于所有其他站点的过滤器 - 为 0,类似于“Laravel 优雅”:)

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 2011-04-24
    • 2014-10-12
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多