Как обработать исключение несоответствия токена в 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'
 ]);
Другие вопросы по тегам