laravel - 多个 ajax 调用的 CSRF 令牌问题
问题描述
我有一个 laravel 页面,允许用户保存搜索,但前提是他们已登录。他们可以登录没有问题或保存搜索没有问题,CSRF 令牌被接受。但是,如果用户必须登录然后保存搜索,我会得到“CSRF 令牌不匹配”。错误。
我假设每个帖子或数据库更新都会生成一个新令牌,但不确定。我应该在发布到控制器之后检索新的 CSRF 令牌,然后更新页面上的 CSRF 输入吗?
我已经在我的标题中尝试过这个
<meta name="csrf-token" content="{{ csrf_token() }}">
并在我的表格中使用它
@csrf
然后在我的 ajax 调用中
var token = $('[name=_token]').val();
令牌正在参数中传递,所以我知道它在那里,但只会在第一个 ajax 调用上工作
解决方案
我不确定您是如何从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')
}
});
推荐阅读
- c++ - 无法在 Cmake 中链接静态库的头文件(.h 没有这样的文件或目录)
- javascript - vanillajs-datepicker 点击获取日期(更改)
- swiftui - @State 变量'nil' 在被选择轮赋值后
- c# - C# 多跳 SSH(通过 SSH 进行 SSH)
- deep-learning - 如何在自动编码器之后为 k-means 连接两个输入(图像+数字数据)?
- node.js - Nodejs Redis 按特定前缀删除所有键,包括其字段
- spring - 如何将下载的文件返回为 DataBuffer
- ruby-on-rails - 如何知道过期日期并为rails中的缓存文件创建日期?
- javascript - 在 Node JS 中保存大文件最节省内存的方法是什么?
- angular - Angular 12 library source maps unavailable