У меня проблема примерно с 1 недели, и когда я оставляю открытой страницу своего приложения, но не использую ее в течение 4 или 5 часов и возвращаюсь, чтобы сделать запрос (нажмите кнопку, чтобы загрузить что-то или что-то в этом роде) каждый раз в консоли отображать это:
{
"error":{
"type":"Illuminate\\Session\\TokenMismatchException",
"message":"",
"file":"C:\\xampp182\\htdocs\\mysite\\app\\filters.php",
"line":97
}
}
Я использую CSRF protección в моей передаче запроса POST для запроса AJAX этой конфигурации
$.ajax({
url: '/path/to/file',
type: 'default GET (Other values: POST)',
dataType: 'default: Intelligent Guess (Other values: xml, json, script, or html)',
data: {param1: 'value1'},
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
})
.done(function() {
console.log("success");
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
});
Это мое filters.php
/*
|--------------------------------------------------------------------------
| CSRF Protection Filter
|--------------------------------------------------------------------------
|
| The CSRF filter is responsible for protecting your application against
| cross-site request forgery attacks. If this special token in a user
| session does not match the one given in this request, we'll bail.
|
*/
Route::filter('csrf', function($route, $request)
{
if (strtoupper($request->getMethod()) === 'GET')
{
return; // get requests are not CSRF protected
}
$token = Request::ajax() ? Request::header('x-csrf-token') : Input::get('_token');
if (Session::token() != $token)
{
throw new Illuminate\Session\TokenMismatchException; //Line 97
}
});
редактировать
Я вижу проблему, Session :: token () и $ token различны, но есть ли способ регенерировать или поместить оба токена с одинаковым значением?
Вот как работает защита CSRF. По истечении времени сеанса генерируется новый токен. Никто обычно не будет заполнять форму в течение 4-5 часов. Если вы делаете это только для тестирования на вашем локальном хосте, вы можете изменить lifetime
в app/config/session
к более высокой стоимости, и это должно работать.
В противном случае вы можете изменить:
throw new Illuminate\Session\TokenMismatchException; //Line 97
в нечто подобное
return Redirect:back()->withInput(Input::except('token'))->with('_token',Session::token());
У меня была эта проблема при входе в систему также. Время от времени это исключение происходило, поэтому я останавливался и пытался воспроизвести его. Я добился успеха, сделав это
Сначала я загружаю страницу входа.
Затем я удалил куки.
Затем, не перезагружая страницу входа, я ввел имя пользователя и пароль и попытался войти.
Поскольку сеанс был удален (когда я удалил куки), было нормальным, что этот код не собирался проходить, и он генерировал исключение TokenMismatchException.
Route::filter('csrf', function() {
if ( Session::getToken() != Input::get('_token')) {
throw new Illuminate\Session\TokenMismatchException;
}
});
Поэтому я решил добавить перенаправление на страницу входа с сообщением, информирующим пользователя о том, что сеанс может истечь.
Route::filter('csrf', function() {
if ( Session::getToken() != Input::get('_token')) {
return Redirect::to('/admin/login')->with('warning', 'Your session has expired. Please try logging in again.');
}
});
Таким образом, после перезагрузки страницы создается новый сеанс и проблема решается.
Просто поместите код ниже в ваши фильтры:
if (Session::token() !== $token)
{
return Redirect::back()->withInput(Input::except('_token'));
}