Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 会话过期时出现Json语法错误_Php_Slim - Fatal编程技术网

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

Php 会话过期时出现Json语法错误,php,slim,Php,Slim,我正在使用Slim Framework,如果用户丢失了会话,我想将用户重定向到登录页面,但我总是在位置0处得到一个SyntaxError:Unexpected token

我正在使用Slim Framework,如果用户丢失了会话,我想将用户重定向到登录页面,但我总是在位置0处得到一个SyntaxError:Unexpected token<

我的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/">');
但是上面的代码让我检查JavaScript上的每一个调用,我想要一个PHP将重定向给我的解决方案。这样,我就不需要一直检查每一个JS调用(非常多),每次实例化php对象时,它都会检查会话并重定向用户,而不使用JS

更新1-包括JS代码(到处都是可爱的投票:D) 上面的代码引用了我的php路线,然后:

$onapp->get('/planeamento/getDados/:tipo/', function($tipo) {
    if ($tipo == 'AUTO') {
        $P = new MongoApi\Planeamento();
        $ret = array(
            $P->getAllMongo();
        );
    }
echo json_encode($ret);
});
当我这样做时,
$p=newmongoapi\Planeamento()我使用_validassao()检查用户在构造函数上是否有有效会话

记住在生成任何输出之前必须调用的。您可以使用和避免在标题之前输出

ob_start ();
header ("Location: http://192.168.0.9/", true, 301);
ob_end_flush ();

服务器无法从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禁止
状态代码进行响应。如果您通过此功能发出所有AJAX请求,它将通过重定向到登录页面自动处理该情况。

@wayneOS谢谢,该功能无论如何都无法正常工作……抱歉,我弄错了。你需要在scritp上设置你的
header()
,这样才能工作。是的,我也试过了,但问题是JS需要JSON响应。使用此解决方案使用chrome dev工具进行调试时,会加载页面,但浏览器不会更新显示的内容!什么JS?您询问的是如何使用php重定向。你能更新你的问题吗,那么我很乐意帮助你;)非常感谢,伙计,有人真的向我解释得很清楚!而且没有否决我的主题万岁!我会投票支持你的答案,伙计;)
$onapp->get('/planeamento/getDados/:tipo/', function($tipo) {
    if ($tipo == 'AUTO') {
        $P = new MongoApi\Planeamento();
        $ret = array(
            $P->getAllMongo();
        );
    }
echo json_encode($ret);
});
ob_start ();
header ("Location: http://192.168.0.9/", true, 301);
ob_end_flush ();
function makeAJAXRequest(url, data) {
    return fetch(url)
        .then(response => {
            if (response.status == 403) {
                window.location = '/login';
                throw new Error('Forbidden');
            } else {
                return response;
            }
        });
}