Laravel 中 AJAX 轮询期间的 TokenMismatchException
Posted
技术标签:
【中文标题】Laravel 中 AJAX 轮询期间的 TokenMismatchException【英文标题】:TokenMismatchException during AJAX polling in Laravel 【发布时间】:2016-06-23 06:28:52 【问题描述】:在我的 Laravel 应用程序中,我有一个通知系统。这是使用 AJAX 轮询技术(即每 5 秒左右运行一次 ajax post 函数)运行的,类似于:
$.ajaxSetup(
headers:
'X-CSRF-Token': CSRF_TOKEN
);
(function pollForNewNotifications()
setTimeout(function ()
$.ajax(
type: 'POST',
url: 'http://example.com/get-notifications',
dataType: 'json',
data:
// data that is sent
,
success: function (data)
// add new notifications if data is not empty logic
pollForNewNotifications();
)
.fail(function (xhr, status, err)
console.error(xhr.responseText)
);
, 5000);
)();
现在大部分时间都有效。
但是,问题是我有时会发现,如果长时间不活动,我会收到 TokenMismatchException in VerifyCsrfToken.php
错误并自动注销。
我认为是这种情况是因为 CSRF 令牌更改或更长是有效的(我可能错了)。
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:您可以删除对该特定 url 的令牌检查,以便它可以在不检查 csrf 令牌的情况下发出请求。转至app/Http/Middleware/VerifyCsrfToken.php
放置这个
protected $except = [
'get-notifications',
];
【讨论】:
【参考方案2】:更改会话的生命周期:
https://github.com/laravel/laravel/blob/a282304/config/session.php#L32
【讨论】:
虽然这可能会有所帮助,但如果我将其设置为一个数字(比如说 5000),那么问题将在 5000 分钟后再次出现。我想要它,以便会话明白它实际上并不是空闲的,而是在做某事。以上是关于Laravel 中 AJAX 轮询期间的 TokenMismatchException的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 在 Azure 中来自单个请求的多个重复 HTTP 请求/查询