首页 > 解决方案 > 多个 ajax 调用的 CSRF 令牌问题

问题描述

我有一个 laravel 页面,允许用户保存搜索,但前提是他们已登录。他们可以登录没有问题或保存搜索没有问题,CSRF 令牌被接受。但是,如果用户必须登录然后保存搜索,我会得到“CSRF 令牌不匹配”。错误。

我假设每个帖子或数据库更新都会生成一个新令牌,但不确定。我应该在发布到控制器之后检索新的 CSRF 令牌,然后更新页面上的 CSRF 输入吗?

我已经在我的标题中尝试过这个

<meta name="csrf-token" content="{{ csrf_token() }}">

并在我的表格中使用它

@csrf

然后在我的 ajax 调用中

var token    = $('[name=_token]').val();

令牌正在参数中传递,所以我知道它在那里,但只会在第一个 ajax 调用上工作

标签: laravelcsrf

解决方案


我不确定您是如何从ajax获取数据的,但token您分配的变量可能无法获取正确的数据。至少如果你的meta上面是设置它的话。

您可以尝试使用属性更改您的token设置content,而不是val()如下(IE 测试从表单中删除并使用您在元中设置的令牌):

var token = $('meta[name="csrf-token"]').attr('content');

要检查的另一件事是如何将其放入ajax中。我发现它在设置到比您的ajax更高的基本文件中的ajax标头中时效果最佳- 在当前ajax调用之外调用标头通常会解决您所遇到的问题。csrf mismatch

$.ajaxSetup({
 headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 }
});

推荐阅读