Laravel API và setInterval AJAX
Mình đang vướng 1 vấn đề khi dùng ajax gọi PUT/POST đến api Laravel nhiều lần theo thời gian cài đặt.
Laravel 8.x jQuery > 3.x
Route API:
Route::put('/topic/savechange', 'TopicController@saveChange')->name('topic.savechange');
Setup Throttle mạc định 60 request trong 1 phút
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60);
});
}
Global JS, lấy csrf-token từ meta đã có phía trên cùng head
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Xử lý JS autosave mỗi 3s
var saveDone = function() {
$.ajax({
url: "savechange",
method: "PUT",
data: {
id: 123332423,
},
});
}
setInterval(() => {
saveDone();
}, 3000);
Nếu mình bấm bằng buttton rồi gọi đến saveDone thì rất bình thường với Throttle 60rq/1min, nhưng để tự động thì từ request thứ 2 trở đi bên phía API sẽ báo csrf token mismatch
Nghiên cứu cả ngày chưa ra, mọi người giúp mình với ạ
1 CÂU TRẢ LỜI
Em đoán do lần đầu $.ajaxSetup()
được gọi do khi load trang. Từ lần thứ 2 nó không bắt được event load trang nên không gọi vào hàm này nữa dẫn đến lỗi csrf token mismatch
Bác thử xử lí theo kiểu set cái token vào data khi call ajax xem sao
$.ajax({
url: "savechange",
method: "PUT",
data: {
id: 123332423,
"_token": $('meta[name="csrf-token"]').attr('content')
},
});
thêm cái header đỡ ảnh hưởng data hơn
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
khả năng cao là cái ajax bị init lại khi gọi setInterval nên mất hết settings