在一个轮询器中Laravel和AJAX零星的401错误

Ric*_*sec 5 php ajax jquery poller laravel

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

我的路线是这样构建的:

Route::post(auction/live/update, 'AuctionController@ajaxSendUpdate');
Run Code Online (Sandbox Code Playgroud)

我的控制器是这样的:

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

最后我的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);
Run Code Online (Sandbox Code Playgroud)

此代码运行良好约95%的时间.但它可以打破2种不同的结果:

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

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

我在Windows上使用Laravel 5.0和最新版本的Xampp.在Windows上使用WAMP可以轻松复制错误.未在Linux或OSX中测试过.我已经在laracasts.com和其他论坛中阅读了这个这个和各种各样的主题,但我无法解决问题...

Ric*_*sec 1

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

\n\n

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

\n\n

然后我遇到了这个。按照网页说明,我将其放入 master.page 标题中:

\n\n
<meta name="csrf-token" content="{{ csrf_token() }}">\n
Run Code Online (Sandbox Code Playgroud)\n\n

这在我的 master.page javascript 中:

\n\n
$.ajaxSetup({\n    headers: {\n        \'X-CSRF-TOKEN\': $(\'meta[name="csrf-token"]\').attr(\'content\')\n    }\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

不知怎的,现在一切都很好。因此,出于所有意图和目的,我原来的问题得到了解决,但我仍然无法理解:

\n\n

1 \xe2\x80\x93 如果我在 kernel.php 中禁用了VerifyCsrfToken 中间件,为什么当我没有通过 AJAX 请求发送任何 _token 时,我会收到偶发的 HTTP 401 错误?

\n\n

2 \xe2\x80\x93 如果我开始使用 AJAX 请求发送 _token,为什么当我在 kernel.php 中启用VerifyCsrfToken 中间件时开始出现零星的 TokenMismatchException?

\n\n

3 \xe2\x80\x93 为什么X-CSRF-TOKEN最终解决了HTTP 500错误问题?请记住,所有错误都是偶发性的,而不是永久性的:我敢说,所有 AJAX 请求中 95% 到 98% 的情况都很好,只有一小部分存在任何问题。

\n