Jquery 如何在laravel post ajax中处理令牌不匹配异常?
在我的Laravel 5.4中,我使用jQuery在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
$.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标记中,还是应该按原样使用?检查此项:检查此项: