Json 会话过期语法错误
Json Syntax Error on Session Expire
我正在使用 Slim Framework,如果用户丢失了他的会话,我想将用户重定向到登录页面,但我总是收到 SyntaxError : Unexpected token < at position 0.
我在 php 中的会话验证代码是这样的:
private function _validaSessao() {
$user = $this->userData['IdUser'];
if(null === $user || trim($user) == '') {
header("Location: http://192.168.0.9/", true, 301);
die();
}
}
我已尝试过该方法以及以下所有方法:
header('refresh:5;url=http://192.168.0.9/');
echo '<script>window.location.href = "http://192.168.0.9/";</script>';
return('<script>window.location.href = "http://192.168.0.9/";</script>');
echo json_encode('<meta HTTP-EQUIV="REFRESH" content="0; url=http://192.168.0.9/">');
我已经尝试了所有方法,而且我总是得到
200 ---- SyntaxError: Unexpected token < in JSON at position 0
唯一对我有用的代码是:
echo json_encode(array(
'SemSessao' => true
));
但是上面的代码让我检查 JavaScript 上的每个调用,我想要一个 PHP 会重定向我的解决方案。这样我就不需要继续检查每个 JS 调用(很多)并且每次实例化 php 对象时它都会检查会话并在不使用 JS 的情况下重定向用户。
更新 1 - 包括 JS 代码(到处都是可爱的反对票 :D)
getDadosPlaneamento: function() {
var req = {Rota: '/planeamento/getDados/AUTO'};
var dfd = $.Deferred();
$.when(App.gajax(req)).done(function(d) {
On.Planeamentos = d.Planeamentos;
dfd.resolve();
});
return dfd.promise();
},
上面的代码是指我的php路线然后:
$onapp->get('/planeamento/getDados/:tipo/', function($tipo) {
if ($tipo == 'AUTO') {
$P = new MongoApi\Planeamento();
$ret = array(
$P->getAllMongo();
);
}
echo json_encode($ret);
});
当我这样做时 $P = new MongoApi\Planeamento();
我会使用 _validaSessao();
检查用户是否在构造函数上有一个有效的会话
请记住 header() must be called before any output is generated. you can use ob_start() and op_end_flush() 以避免在 header 之前输出。
ob_start ();
header ("Location: http://192.168.0.9/", true, 301);
ob_end_flush ();
服务器无法从 AJAX 调用重定向客户端。 AJAX 调用是后台 HTTP 请求。 HTTP 请求是否被重定向与浏览器无关。浏览器将 return 对 AJAX 客户端的请求响应,如果该响应是 "your request has been redirected" 那么就是这样。同样,重定向不会重定向 "the browser",它会重定向 HTTP 请求 。或者更准确地说,它告诉 HTTP 客户端它应该在其他地方重试它的请求;仅此而已。
如果您的 AJAX 请求可能由于会话超时而失败,并且无论何时发生这种情况,您都希望向用户显示登录页面,您将不得不在客户端进行操作。为了不每次都重复相同的代码,你从中制作了一个 function/object/service 。例如。类似于:
function makeAJAXRequest(url, data) {
return fetch(url)
.then(response => {
if (response.status == 403) {
window.location = '/login';
throw new Error('Forbidden');
} else {
return response;
}
});
}
此处服务器应针对未经授权的请求以 403 Forbidden
状态代码进行响应。如果您通过此功能发出所有 AJAX 请求,它将通过重定向到登录页面自动处理这种情况。
我正在使用 Slim Framework,如果用户丢失了他的会话,我想将用户重定向到登录页面,但我总是收到 SyntaxError : Unexpected token < at position 0.
我在 php 中的会话验证代码是这样的:
private function _validaSessao() {
$user = $this->userData['IdUser'];
if(null === $user || trim($user) == '') {
header("Location: http://192.168.0.9/", true, 301);
die();
}
}
我已尝试过该方法以及以下所有方法:
header('refresh:5;url=http://192.168.0.9/');
echo '<script>window.location.href = "http://192.168.0.9/";</script>';
return('<script>window.location.href = "http://192.168.0.9/";</script>');
echo json_encode('<meta HTTP-EQUIV="REFRESH" content="0; url=http://192.168.0.9/">');
我已经尝试了所有方法,而且我总是得到
200 ---- SyntaxError: Unexpected token < in JSON at position 0
唯一对我有用的代码是:
echo json_encode(array(
'SemSessao' => true
));
但是上面的代码让我检查 JavaScript 上的每个调用,我想要一个 PHP 会重定向我的解决方案。这样我就不需要继续检查每个 JS 调用(很多)并且每次实例化 php 对象时它都会检查会话并在不使用 JS 的情况下重定向用户。
更新 1 - 包括 JS 代码(到处都是可爱的反对票 :D)
getDadosPlaneamento: function() {
var req = {Rota: '/planeamento/getDados/AUTO'};
var dfd = $.Deferred();
$.when(App.gajax(req)).done(function(d) {
On.Planeamentos = d.Planeamentos;
dfd.resolve();
});
return dfd.promise();
},
上面的代码是指我的php路线然后:
$onapp->get('/planeamento/getDados/:tipo/', function($tipo) {
if ($tipo == 'AUTO') {
$P = new MongoApi\Planeamento();
$ret = array(
$P->getAllMongo();
);
}
echo json_encode($ret);
});
当我这样做时 $P = new MongoApi\Planeamento();
我会使用 _validaSessao();
请记住 header() must be called before any output is generated. you can use ob_start() and op_end_flush() 以避免在 header 之前输出。
ob_start ();
header ("Location: http://192.168.0.9/", true, 301);
ob_end_flush ();
服务器无法从 AJAX 调用重定向客户端。 AJAX 调用是后台 HTTP 请求。 HTTP 请求是否被重定向与浏览器无关。浏览器将 return 对 AJAX 客户端的请求响应,如果该响应是 "your request has been redirected" 那么就是这样。同样,重定向不会重定向 "the browser",它会重定向 HTTP 请求 。或者更准确地说,它告诉 HTTP 客户端它应该在其他地方重试它的请求;仅此而已。
如果您的 AJAX 请求可能由于会话超时而失败,并且无论何时发生这种情况,您都希望向用户显示登录页面,您将不得不在客户端进行操作。为了不每次都重复相同的代码,你从中制作了一个 function/object/service 。例如。类似于:
function makeAJAXRequest(url, data) {
return fetch(url)
.then(response => {
if (response.status == 403) {
window.location = '/login';
throw new Error('Forbidden');
} else {
return response;
}
});
}
此处服务器应针对未经授权的请求以 403 Forbidden
状态代码进行响应。如果您通过此功能发出所有 AJAX 请求,它将通过重定向到登录页面自动处理这种情况。