【问题标题】:Json Syntax Error on Session Expire会话过期时的 Json 语法错误
【发布时间】:2018-06-07 17:48:43
【问题描述】:

我正在使用 Slim 框架,如果用户丢失了会话,我想将用户重定向到登录页面,但我总是收到 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/">');

我都试过了,我总是得到

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(); 检查用户在构造函数上是否有有效会话;

【问题讨论】:

  • @wayneOS 谢谢,反正那个也不行……
  • 对不起,我误会了。你需要在你的脚本上设置你的header() 才能工作。

标签: php slim


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

【讨论】:

  • 非常感谢,有人向我解释得很清楚!并且没有对我的话题投反对票!我会赞成你的回答人;)
【解决方案2】:

请记住,必须在生成任何输出之前调用 header()。您可以使用ob_start()op_end_flush() 来避免在标题之前输出。

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

【讨论】:

  • 是的,我已经尝试过了,但问题是 JS 期待 JSON 响应。使用此解决方案使用 chrome 开发工具进行调试时,页面已加载,但浏览器不会更新显示的内容!
  • 什么JS?您在询问有关使用 php 进行重定向的问题。您能否更新您的问题,然后我很乐意为您提供帮助;)
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2014-07-26
  • 2013-11-18
  • 2011-04-23
相关资源
最近更新 更多