多次尝试后,Laravel 5.5 在 ajax 调用中不断收到 419 发布错误

Posted

技术标签:

【中文标题】多次尝试后,Laravel 5.5 在 ajax 调用中不断收到 419 发布错误【英文标题】:Laravel 5.5 keep getting 419 post error on ajax call after several attempts 【发布时间】:2018-06-23 22:43:04 【问题描述】:

我非常感谢您对此的帮助。我尝试了每个人在其他帖子中建议的所有解决方案,包括:Laravel 5.5 ajax call 419 (unknown status) 和这个Ajax LARAVEL 419 POST error 解决方案。

但即使我在 head 部分设置 csrf_token 元标记,我也会不断收到 419 错误:

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

在 ajax post call 之前,我像这样设置 ajax csrf_token:

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

然后,我将 ajax 数据中的 csrf_token 作为变量发送,如下所示:

$.ajax(
        url     : "/getCompare",
        type    :"POST",
        cash    : false,
        data    : id : id,_token: 'csrf_token()',
        success :
           function( response ) 
              $("#compare_products").html(response);
             
        );

页面的应用方式是用户反复请求ajax调用来比较产品。它在很多尝试中都可以正常工作,但在特定情况下,它会引发 419 错误。这种情况有时是当我在页面加载后大约 3 分钟按下按钮时,它给了我这个错误。或者有时它会在第三次或第四次尝试时给出错误。重新加载页面后问题得到解决,但它仍然按照我解释的方式再次发送该错误。

我的问题是为什么会这样? csrf_token 是 3 分钟后过期还是什么?而且我不想在 verifyCsrfToken 中间件中添加异常。 有什么办法解决这个问题?

PS: leorent 的回答非常正确。但是在将我的项目上传到实际的在线服务器之后。问题已经消失了。 我不知道为什么,但这个问题是因为 windows 并在本地主机本地运行 laravel 项目。 csrf 令牌会话在 widows localhost 服务器上经常过期。不用担心,将项目上传到实际服务器后,您的csrf问题将自动解决。

【问题讨论】:

密切关注您的网络标签。确保为每个请求发送相同的会话令牌。还要确保在同一页面中不存在刷新 csrf 令牌的条件。 @apokryfos 是否假设在每个请求中发送相同的 csrf_token? 是的,会话令牌和 csrf 令牌应该保持不变,除非您在后端手动更改它们。 @apokryfos 我检查了 csrf_token,结果发现它在每个请求中都是相同的令牌。当我等待几分钟然后发出请求时会发生此错误。如果我重复发送请求,它不会给我那个错误。 您的会话设置为空闲时持续多长时间? (应该在lifetime下的config/session.php文件中) 【参考方案1】:

添加带有 id 的元标记:

<input type="hidden" name="_token" id="token" value=" csrf_token() ">

然后在您的 ajax 调用中:

     $.ajax(
         url     : "/getCompare",
         type    :"POST",
         cash    : false,
         data: 'id': id, "_token": $('#token').val(),
         type: 'POST',


         success: function (response) 

         ,
         error: function (response) 

         
     );

【讨论】:

我应该在ajax调用之前在这个方法中设置ajax csrf头吗? @SalarBahador 如果您发送这样的令牌,则不需要标头 @谢谢,问题已解决。但这样做是否是最佳做法? @SalarBahador 标记为已回答,此时并不重要。 这比使用.ajaxSetup 更好,因为这样如果你发送一个 CORS 请求,你就不会意外地发送 CSRF 令牌(这可能是一个安全问题)

以上是关于多次尝试后,Laravel 5.5 在 ajax 调用中不断收到 419 发布错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.5 中使用 AJAX

Laravel 5.5:AJAX 的 419 未知状态

Laravel 5.5 安装不生成 .env 文件

Laravel 5.5 AJAX Post Call 没有消息异常。第 203 行,Handler.php,419 未知状态

Laravel 5.5 AJAX Post Call上没有消息异常。第203行,Handler.php,419未知状态

Laravel 5.5 FormRequest 自定义错误消息