You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10中AJAX轮询导致CSRF令牌失效问题求助

解决Laravel 10中AJAX轮询导致CSRF令牌失效的问题

问题核心

Laravel从5.7升级到10后,你每5秒一次的GET轮询请求携带了页面加载时生成的固定CSRF令牌,而Laravel 10的CSRF验证机制更严格——GET请求原本不需要CSRF令牌,重复传递旧令牌会触发框架的令牌刷新逻辑,导致登录、表单提交时使用的有效令牌被覆盖失效。

解决方案

1. 移除GET请求中的CSRF令牌(最直接有效)

GET请求属于只读请求,Laravel的CSRF保护默认不对其生效,完全没必要在请求里携带_token参数。修改JS代码如下:

function pollActiveEvent() { 
    var locale = localStorage.getItem('selectedLanguage') || 'default_locale';

    $.ajax({
        url: '/get-active-event-translations',
        type: 'GET',
        data: { locale: locale }, // 移除多余的_token参数
        success: function(response) {
            updateActiveEvent(response);
            setTimeout(pollActiveEvent, 5000);
        },
        error: function() {
            console.error("获取活动事件翻译失败。");
            setTimeout(pollActiveEvent, 5000);
        }
    });
}

pollActiveEvent();

2. 确认路由配置正确性

检查routes/web.php中该路由的定义,确保是GET类型,没有错误设置为POST/PUT等需要CSRF验证的请求方法:

Route::get('/get-active-event-translations', [YourController::class, 'getActiveEventTranslations']);

3. 验证VerifyCsrfToken中间件例外(可选)

如果你之前尝试添加路由例外但未生效,检查app/Http/Middleware/VerifyCsrfToken.php的$except数组是否正确配置:

protected $except = [
    '/get-active-event-translations',
];

注:这一步并非必须,因为GET请求默认不受CSRF保护,除非你手动修改了中间件逻辑。

失效原因说明

Laravel 10中,当请求携带CSRF令牌时,框架会验证令牌有效性,部分场景下会刷新会话中的令牌。你的轮询每5秒重复使用页面加载时的旧令牌,会导致会话内的有效令牌被错误覆盖,后续登录或表单提交时,页面令牌与会话令牌不匹配,触发CSRF验证失败。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:29:53