如何处理laravel post ajax中的令牌不匹配异常?

How to to handle token mismatch exception in laravel post 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 调用 returns 上出现令牌不匹配时,得到类似 response.status == "TOKEN-ERROR" 的响应,我使用 window.loaction.reload(1); 重新加载页面。

有没有更有效的方法来处理这种情况而不重新加载页面从而失去用户的进度?

当我使用 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'
 ]);

在您的 app/Exceptions/Handler.php 文件中

render 方法中为 TokenMismatchException 添加处理程序

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);
}

这将 return 一个错误 json 响应。您可以自定义错误响应以满足您的需要。