我已经完成了这个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');
});
});
});
filter.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');
}
答案 0 :(得分:1)
Shift Exchange:
您确定浏览器在按下时不会“刷新”页面吗? '回' - 因为'没有缓存'?试试这个:加载表单,查看 来源,看看@隐藏的令牌代码。然后提交表格,按 回来,看看隐藏的令牌代码 - 它们是一样的吗?
尝试Tobemyself Rahu:
不,他们不是一样的
那是你的答案!当您按“返回”时,您的浏览器正在“刷新”页面!
因此,您的代码适用于大多数浏览器 - 但无论您使用哪种浏览器都会自动刷新“返回”页面 - 因此您的令牌会在表单上重新填充。就像用户正在“重新审视”表单一样 - 所以你几乎无法做到这一点。它适用于大多数浏览器......
或者您可以关闭表单的“无缓存” - 或将其设置为5分钟或类似内容 - 因此浏览器不会刷新页面。
也许有一个'形式'缓存过滤器 - 这是5分钟和所有其他网站的过滤器 - 这是0,类似于'Laravel elegant':)