为什么我在登录我的 Laravel 8 应用程序后仅在第一次加载时收到错误 CSRF 令牌不匹配?

问题描述 投票:0回答:2

我有一个表单,其中包含一些字段,在填充第一个输入后,通过对控制器的 ajax 调用加载它们的值。

我在刀片文件中使用“@csrf”将令牌作为输入添加到我的表单中。

为了进行 Ajax 调用,我在数据部分发送了 CSRF 令牌。

我第一次登录我的应用程序并加载表单所在的页面时,在执行 Ajax 调用时出现“CSRF 令牌不匹配”错误。如果我使用 F5 键正常重新加载页面或只需单击浏览器上的重新加载按钮,它就可以完美运行。

什么在我的应用程序中产生了这种行为,我该如何解决?

我知道我们可以通过禁用这条路线的令牌保护来绕过这个问题,但这是我最不想做的事情。

php jquery ajax laravel laravel-blade
2个回答
0
投票

您必须将 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() }}`
  }
});

0
投票

我发现我可以在不关心令牌的情况下对我的控制器进行 GET 调用。考虑到这一点,我让控制器重新生成我的会话令牌并将其发送回视图。

我刚刚发送到视图的令牌将用于 POST ajax 调用并且工作完美。

© www.soinside.com 2019 - 2024. All rights reserved.