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

时间:2015-10-28 13:25:26

标签: php jquery ajax laravel poller

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

我的路线是这样构建的:

$query = $this->db->query('SELECT 
    (MONTH(student_add_date)) AS month_temp, 
    ((count(*) /(SELECT count(*) FROM students WHERE MONTH(student_add_date) = 9 OR MONTH(student_add_date) = 10)) * 100)percentace 
    from students 
    WHERE 
    MONTH(student_add_date) = 9 
    OR 
    MONTH(student_add_date) = 10 
    group by month_temp');


$result = $query->result_array();

// var_dump($result);

return $result;

我的控制器是这样的:

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

最后我的poller设置如下:

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

此代码运行良好约95%。然而,它可以打破两种不同的结果:

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

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

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

1 个答案:

答案 0 :(得分: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错误问题?请记住,所有错误都是零星的,而不是永久性的:我冒昧地说,所有AJAX请求的95%到98%都没有问题,只有少数几个有任何问题。