我正在使用Slim Framework,如果用户丢失了会话,我想将用户重定向到登录页面,但我总是得到一个SyntaxError:意外的令牌<在位置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。
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()确认用户是否在构造函数上有有效会话;
答案 0 :(得分:1)
服务器无法从AJAX调用重定向客户端。 AJAX调用是后台HTTP请求。是否重定向HTTP请求与浏览器无关。浏览器会将请求响应返回给AJAX客户端,如果该响应是“您的请求已被重定向”,那就是那样。同样,重定向不会重定向“浏览器”,它会重定向 HTTP请求。或者更确切地说,它告诉HTTP客户端它应该在其他地方重试它的请求;仅此而已。
如果您的AJAX请求由于会话超时而失败,并且每当发生这种情况时您希望向用户显示登录页面时,您将必须执行该客户端。为了不每次都重复相同的代码,你可以创建一个函数/对象/服务。例如。类似的东西:
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请求,它将通过重定向到登录页面自动处理该情况。
答案 1 :(得分:-1)
记住在生成任何输出之前必须调用header()。您可以使用ob_start()和op_end_flush()来避免在标题之前输出。
ob_start ();
header ("Location: http://192.168.0.9/", true, 301);
ob_end_flush ();