我正在编写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和其他论坛上阅读了this和this以及各种各样的主题,但我无法解决问题......
答案 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%都没有问题,只有少数几个有任何问题。