【问题标题】:Laravel and AJAX sporadic 401 errors in a poller轮询器中的 Laravel 和 AJAX 零星 401 错误
【发布时间】:2016-01-28 07:09:35
【问题描述】:

我正在用 Laravel 5.0 编写一个拍卖网站,它使用每 5 秒执行一次的 AJAX 轮询器来模拟实时更新。问题是我的服务器返回零星的 HTTP 401 状态。

我的路线是这样构建的:

Route::post(auction/live/update, 'AuctionController@ajaxSendUpdate');

我的控制器是这样的:

public function ajaxSendUpdate() {
    // Business logic: queries database, couple of Ifs, etc…
    $data = array('success' => true, 'otherStuff' => $myData);
    return Response::json($data);
}

最后我的 poller 是这样设置的:

// a bit of HTML
function getAuctionUpdate() {
    setTimeout(function () {
    $.ajax({
        type: "POST",
        url: "{!! url('auction/live/update')!!}",
            dataType: 'json',
            data: {
                auctionID: $('#auctionID').val()
            },
            success: function (data) {
                if (data['success']) {
                    // Updates some labels, etc.
                   getAuctionUpdate(); // Rearms itself
                }
            }
    } }); // Not sure if all brackets are correct in this snippet but they are 100% on real code
}, 5000);

这段代码在大约 95% 的情况下都能正常运行。但是,它可能会出现 2 种不同的结果:

1) 服务器在一段时间后响应错误 401 并且永远不会恢复。在这种情况下,我们需要再次登录。登录后一切顺利,再也不会出现这种结果。

2) 服务器以零星的 401 响应,但在下一个(或几次)轮询请求中恢复。

我在 Windows 上使用 Laravel 5.0 和最新版本的 Xampp。在 Windows 上使用 WAMP 很容易重现该错误。未在 Linux 或 OSX 中测试。我已经阅读了 thisthis 以及 laracasts.com 和其他论坛中的各种主题,但我无法解决问题...

【问题讨论】:

  • 您有语法错误。 url: "{!! url('auction/live/update') !!}",
  • 你是对的,但这是复制粘贴的问题(我还将代码从我的母语翻译成英文,以便于阅读)。原始代码很好......
  • 也有这个,不知道是不是上面所说的复制错误:auctionID: $('# auctionID).val()#后有空格,auctionID后缺少关闭'
  • 谢谢,我修正了错字,但它也是复制粘贴/翻译错误。更大的问题(HTTP 错误 401)仍未解决。

标签: php jquery ajax laravel poller


【解决方案1】:

经过数小时的测试,我相信我解决了这个问题,即使我不完全理解如何以及即使这是一个可以应用于类似案例的通用答案。

在开发的早期,我在 kernel.php 中禁用了 VerifyCsrfToken 中间件,因此我没有在 AJAX 请求中发送任何 _token。启用 VerifyCsrfToken 中间件并立即发送 _token 会使所有 HTTP 401 错误消失。现在,我开始遇到一个不同的问题:更零星的 HTTP 500 错误。快速浏览日志显示所有 HTTP 500 错误都是由 TokenMismatchException 引起的。

然后我遇到了this。按照网页说明,我把它放在我的 master.page 标题中:

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

这在我的 master.page javascript 中:

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

不知何故,现在一切都很好。因此,出于所有意图和目的,我最初的问题已解决,但我仍然无法理解:

1 – 如果我在 kernel.php 中禁用了 VerifyCsrfToken 中间件,为什么我没有在 AJAX 请求中发送任何 _token 时会出现零星的 HTTP 401 错误?

2 – 如果我开始在 AJAX 请求中发送 _token,为什么我在 kernel.php 中启用了 VerifyCsrfToken 中间件时会开始出现零星的 TokenMismatchException?

3 – 为什么 X-CSRF-TOKEN 最终解决了 HTTP 500 错误问题?请记住,所有错误都是零星的,而不是永久性的:我敢说 95% 到 98% 的 AJAX 请求都正常,只有一小部分有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多