Laravel和AJAX在一个轮询器中出现了401个零星错误



我正在Laravel 5.0中编写一个拍卖网站,该网站通过使用每5秒执行一次的AJAX轮询器来模拟实时更新。问题是我的服务器偶尔会返回HTTP401状态。

我的路线是这样构建的:

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);
}

最后,我的民意测验是这样设置的:

// 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%的情况下运行良好。然而,它可以打破两种不同的结果:

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

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

我在Windows上使用Laravel 5.0和Xampp的最新版本。在Windows上使用WAMP可以很容易地重现该错误。未在Linux或OSX中测试。我在laracasts.com和其他论坛上读过这个、这个和各种各样的帖子,但我无法解决这个问题。。。

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

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

然后我发现了这个。按照网页说明,我把这个放在我的主页上。页面标题:

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

这是我的大师级文章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请求都很好,只有一小部分有任何问题。

最新更新