Как обработать исключение несоответствия токена в ajax?
В моем Laravel 5.4 я использую следующий код в моем ajax с использованием jQuery:
$.ajax({
url : 'http://example.com/addmember',
method : 'POST',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
beforeSend : function()
{},
data : $('#theForm').serialize(),
success : function(response)
{
// I do something here
},
error : function(e)
{
console.log(e);
},
complete : function(c){
}
});
Иногда я получаю исключение несоответствия токена, например: Обычно я получаю эту ошибку, когда пользователь остается на странице в течение очень долгого времени, прежде чем запустить AJAX-запрос.
Как я могу справиться с ситуацией?
Я даже сделал промежуточное ПО, которое при несовпадении токена при вызове ajax возвращает ответ response.status == "TOKEN-ERROR"
при получении этого я перезагрузить страницу с помощью window.loaction.reload(1);
,
Есть ли более эффективный способ справиться с ситуацией, не перезагружая страницу и, таким образом, теряя прогресс пользователя?
2 ответа
В вашем app/Exceptions/Handler.php
файл
Добавить обработчик для TokenMismatchException
в render
метод
public function render($request, Exception $exception)
{
if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
if ($request->expectsJson()) {
return response()->json([
'error' => 'Token mismatch'
], $exception->getStatusCode());
};
}
return parent::render($request, $exception);
}
Это вернет ошибку json response. Вы можете настроить ответ об ошибке в соответствии с вашими потребностями.
Когда я использую Ajax-вызов, я добавляю к данным атрибут _token:
$("input").on("someFunction", function(event) {
var score = $(this).val();
var scoreId = $(this).data('score-id');
$("#" + scoreId).text(event.value);
console.log(scoreId + ' => ' + score);
var data = {
"_token": "{{ csrf_token() }}",
"score": score,
"scoreId" : scoreId
};
$.ajax({
data: data,
type: "POST",
url: '{!! route('score.store', $id) !!}',
success: function (result) {
console.log(result);
},
error: function (xhr, status, error) {
var err = eval("(" + xhr.responseText + ")");
alert(err.error);
}
});
});
В моем web.php я добавляю этот элемент в маршрут:
Route::post('/path/to/route/{id}/score/store', [
'before' => 'csrf',
'as' => 'score.store',
'uses' => 'Score\ScoreController@saveScore'
]);