我在Laravel应用程序中使用Ajax发出了一堆POST请求。
典型的请求如下:
$.ajax({
url: '/path/to/method',
data: {'id': id},
type: 'POST',
datatype: 'JSON',
success: function (response) {
//handle data
},
error: function (response) {
//handle error
}
});
我有CSRF令牌集,大部分时间一切正常:
jQuery(document).ready(function(){
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
});
但是,经过长时间的中断(例如,计算机长时间处于睡眠状态),所有Ajax调用都会返回419错误,就好像令牌没有设置一样。我重新加载页面后,一切都恢复正常。这是在本地服务器上。
我该如何解决这个问题?是否有某种方式可以更新"通话前的令牌?在每次通话之前我是否必须执行$.ajaxSetup
位?在页面加载时执行此操作是不够的?
答案 0 :(得分:4)
这是我的建议:
JS
//create a function to set header
function setHeader(data){
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': data
}
});
}
//in first load of the page set the header
setHeader($('meta[name="csrf-token"]').attr('content'));
//create function to do the ajax request cos we need to recall it when token is expire
function runAjax(data){
$.ajax({
url: '/path/to/method',
data: {'id': id},
type: 'POST',
datatype: 'JSON',
success: function (response) {
//handle data
},
error: function (jqXHR, textStatus, errorThrown) {
if(jqXHR.status==419){//if you get 419 error which meantoken expired
refreshToken(function(){refresh the token
runAjax();//send ajax again
});
}
}
});
}
//token refresh function
function refreshToken(callback){
$.get('refresh-csrf').done(function(data){
setHeader(data);
callback(true);
});
}
//Optional: keep token updated every hour
setInterval(function(){
refreshToken(function(){
console.log("Token refreshed!");
});
}, 3600000); // 1 hour
<强>路线强>
//route to get the token
Route::get('refresh-csrf', function(){
return csrf_token();
});
希望这有帮助。