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 中删除多条记录

Ajax 请求期间出现 500 错误

使用 Laravel 在 Azure 中来自单个请求的多个重复 HTTP 请求/查询

API:Laravel 中的 Ajax 帖子 - 403(禁止)

php javascript comet

Laravel 中的 Socket.io 轮询 404