Laravel 和 AJAX 轮询器中偶尔出现 401 错误
Laravel and AJAX sporadic 401 errors in a poller
我正在 Laravel 5.0 中编写一个拍卖网站,该网站通过使用每 5 秒执行一次的 AJAX 轮询器来模拟实时更新。问题是我的服务器 returns 偶尔出现 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);
}
最后我的轮询器设置如下:
// 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 中测试。我已经阅读了 this and this 以及 laracasts.com 和其他论坛中的各种主题,但我无法解决问题...
经过几个小时的测试,我相信我已经解决了这个问题,即使我不完全理解如何解决这个问题,即使这是一个可以应用于类似案例的通用答案。
在开发初期,我在 kernel.php 中禁用了 VerifyCsrfToken 中间件,因此我没有在 AJAX 请求中发送任何 _token。启用 VerifyCsrfToken 中间件并立即发送 _token 使所有 HTTP 401 错误消失。现在,我开始遇到一个不同的问题:更零星的 HTTP 500 错误。快速浏览一下日志,发现所有 HTTP 500 错误都是由 TokenMismatchException 引起的。
然后我遇到了 this。按照网页说明,我将其放入 master.page header:
<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 – 当我在 kernel.php 中启用 VerifyCsrfToken 中间件时,如果我开始使用我的 AJAX 请求发送 _token,为什么我会开始偶尔出现 TokenMismatchException?
3 – 为什么 X-CSRF-TOKEN 最终解决了 HTTP 500 错误问题?请记住,所有错误都是偶发的而不是永久性的:我敢说所有 AJAX 请求中的 95% 到 98% 都没有问题,只有一小部分有任何问题。
我正在 Laravel 5.0 中编写一个拍卖网站,该网站通过使用每 5 秒执行一次的 AJAX 轮询器来模拟实时更新。问题是我的服务器 returns 偶尔出现 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);
}
最后我的轮询器设置如下:
// 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 中测试。我已经阅读了 this and this 以及 laracasts.com 和其他论坛中的各种主题,但我无法解决问题...
经过几个小时的测试,我相信我已经解决了这个问题,即使我不完全理解如何解决这个问题,即使这是一个可以应用于类似案例的通用答案。
在开发初期,我在 kernel.php 中禁用了 VerifyCsrfToken 中间件,因此我没有在 AJAX 请求中发送任何 _token。启用 VerifyCsrfToken 中间件并立即发送 _token 使所有 HTTP 401 错误消失。现在,我开始遇到一个不同的问题:更零星的 HTTP 500 错误。快速浏览一下日志,发现所有 HTTP 500 错误都是由 TokenMismatchException 引起的。
然后我遇到了 this。按照网页说明,我将其放入 master.page header:
<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 – 当我在 kernel.php 中启用 VerifyCsrfToken 中间件时,如果我开始使用我的 AJAX 请求发送 _token,为什么我会开始偶尔出现 TokenMismatchException?
3 – 为什么 X-CSRF-TOKEN 最终解决了 HTTP 500 错误问题?请记住,所有错误都是偶发的而不是永久性的:我敢说所有 AJAX 请求中的 95% 到 98% 都没有问题,只有一小部分有任何问题。