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 请求,它将通过重定向到登录页面自动处理这种情况。