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
相关产品推荐
相关产品推荐

