Я прошел этот вопрос , но ответ опубликовал их, не решает мою проблему.
Возникающая проблема заключается в том, что если пользователь обращается к кнопке «Назад» браузера, чтобы вернуться к представленной форме, введенные данные сохраняются, и пользователь может «повторно отправить» форму. Как я могу предотвратить это поведение (путь 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'); }
Обмен Shift:
Вы уверены, что ваш браузер не «обновляет» страницу, когда нажимает «назад» – из-за «отсутствия кеша»? Попробуйте это: загрузите форму, просмотрите источник, посмотрите @ скрытый код токена. Затем отправьте форму, нажмите Назад, и @ посмотрите на скрытый код токена – они одинаковы?
Попытка Тобайсе Раху:
нет, они не то же самое
Тогда это ваш ответ! Ваш браузер обновляет страницу, когда вы нажимаете «назад»!
Таким образом, ваш код «работает» для большинства браузеров, но независимо от того, какой браузер вы используете, он автоматически обновляет страницу на «обратной стороне», поэтому ваш токен повторно заполняется в форме. Это так же, как пользователь «пересматривает» форму, поэтому вы можете сделать это, чтобы остановить это. Он будет работать для большинства браузеров …
Или вы можете отключить «no-cache» для формы – или настроить его как 5 минут или что-то еще, – поэтому браузер не обновит страницу.
Возможно, у вас есть фильтр кеш-формы, который составляет 5 минут и фильтр для всего другого сайта, который равен 0, что-то вроде «Laravel elegant» 🙂