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

Jquery 如何在laravel post ajax中处理令牌不匹配异常?,jquery,ajax,laravel,laravel-5,csrf,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

在我的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){
                }
            });
有时会得到一个令牌不匹配异常,如下所示: 当用户在触发AJAX请求之前在页面上停留很长时间时,我通常会遇到这个错误

我如何处理这种情况

我甚至制作了一个中间件,当ajax调用中出现令牌不匹配时,它会返回一个类似
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);
      }
   });
});
在my web.php中,我将此项添加到路线:

 Route::post('/path/to/route/{id}/score/store', [
    'before' => 'csrf',
    'as' => 'score.store',
    'uses' => 'Score\ScoreController@saveScore'
 ]);

在使用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);
      }
   });
});
在my web.php中,我将此项添加到路线:

 Route::post('/path/to/route/{id}/score/store', [
    'before' => 'csrf',
    'as' => 'score.store',
    'uses' => 'Score\ScoreController@saveScore'
 ]);

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

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

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响应。您可以根据需要自定义错误响应。

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

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

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

我假设
“_-token”:“{csrf_-token()}”,
头:{'X-csrf-token':$('meta[name=“csrf-token”]')。attr('content')},
也做同样的事情。另外请解释
中间件('can:updatescore,App\score')
我假设
“_-token”:“{csrf_-token()}”,
头:{'X-csrf-token':$('meta[name=“csrf-token”]')。attr('content')},
做同样的事情。另外请解释
中间件('can:updatescore,App\score')足够公平。。正如我在问题中提到的,我已经得到了我想要的json。如何在不刷新页面的情况下处理此错误?i、 e获取正确(未过期)的CSRF令牌?一种方法是使用令牌生成路由在令牌不匹配错误时获取新的令牌。我如何做?路由::get('CSRF-token',函数(){return response()->json(['token'=>CSRF_token());});我是否需要将此令牌设置到cookie/meta标记中,还是应该按原样使用它?很公平。。正如我在问题中提到的,我已经得到了我想要的json。如何在不刷新页面的情况下处理此错误?i、 e获取正确(未过期)的CSRF令牌?一种方法是使用令牌生成路由在令牌不匹配错误时获取新的令牌。我如何做?路由::get('CSRF-token',函数(){return response()->json(['token'=>CSRF_token());});我是否需要将此令牌设置到cookie/meta标记中,还是应该按原样使用?检查此项:检查此项: