会话过期时出现Json语法错误

时间:2018-06-07 09:14:55

标签: php slim

我正在使用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。

更新1 - 包含JS代码(可爱的downvotes无处不在: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()确认用户是否在构造函数上有有效会话;

2 个答案:

答案 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 ();