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

时间:2017-05-17 18:55:36

标签: jquery ajax laravel laravel-5 csrf

在我的Laravel 5.4中,我使用jQuery在我的ajax中使用以下代码:

            $.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){
                }
            });

有时获取令牌不匹配异常,如下所示: enter image description here 当用户在触发AJAX请求之前在页面上停留很长时间时,我通常会收到此错误。

我该如何处理这种情况?

我甚至制作了一个中间件,在ajax调用上的令牌不匹配时会返回类似response.status == "TOKEN-ERROR"的响应,我会使用window.loaction.reload(1);重新加载页面。

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

2 个答案:

答案 0 :(得分:1)

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响应。您可以自定义错误响应以满足您的需求。

答案 1 :(得分:0)

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