我有一个表单,其中包含一些字段,在填充第一个输入后,通过对控制器的 ajax 调用加载它们的值。
我在刀片文件中使用“@csrf”将令牌作为输入添加到我的表单中。
为了进行 Ajax 调用,我在数据部分发送了 CSRF 令牌。
我第一次登录我的应用程序并加载表单所在的页面时,在执行 Ajax 调用时出现“CSRF 令牌不匹配”错误。如果我使用 F5 键正常重新加载页面或只需单击浏览器上的重新加载按钮,它就可以完美运行。
什么在我的应用程序中产生了这种行为,我该如何解决?
我知道我们可以通过禁用这条路线的令牌保护来绕过这个问题,但这是我最不想做的事情。
您必须将 CSRF 令牌发送到 ajax 标头中。如果你没有
<meta name="csrf-token" content="{{ csrf_token() }}" />
您可以在 html 中的
<head></head>
标记内添加此代码。之后,您可以像这样将 csrf 令牌发送到标头 ajax 请求中
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
但另一种方法可以像这样直接添加到标题 ajax
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': `{{ csrf_token() }}`
}
});
我发现我可以在不关心令牌的情况下对我的控制器进行 GET 调用。考虑到这一点,我让控制器重新生成我的会话令牌并将其发送回视图。
我刚刚发送到视图的令牌将用于 POST ajax 调用并且工作完美。