为什么我的系统会自动注销?

时间:2015-11-16 14:45:37

标签: javascript php session

我登录我的网站(在localhost上运行),并将用户ID存储在会话变量

$_SESSION['user_id'] = $user_id;

主页加载,一切都很好。我在主页面上显示用户ID,所以我确定它的价值。当我加载另一页时,使用

php = 'some_php_file.php';
window.open(php,php);

第二页打开确定。但是,如果我再次尝试打开同一页面,单击主页面上的相同按钮,系统将退出。如果我省略window.open()中的第二个php(使用''而不是),我可能会有同一个窗口的多个副本(我不想要的),但是没有自动注销的问题。

知道可能发生的事情吗?

编辑:如果我关闭第二个窗口并重复此过程,我没有注销问题。我可以按照自己的意愿关闭并重新打开第二个窗口。只有当我尝试打开第二个窗口时才会出现问题,但它已经打开。我也可以打开不同的第二个窗口' (不同的php文件)。如果我尝试在同一个窗口打开TWICE,我才会被注销。

编辑2:似乎我找到了它。在我调用window.open()之前,我正在测试php文件是否存在,使用此函数:

function fileExists(url){
    var http = new XMLHttpRequest();
    http.open('HEAD',url,true);
    http.send();
    return http.status != 404;
}

如果我将http.open()行更改为

http.open('HEAD',url,false);

它有效!但是manual告诉我们使用' true'在第三个参数......我该怎么办?

1 个答案:

答案 0 :(得分:1)

在我看来,fileExists函数一直只返回true因为它不等待XHR完成。除非您指定async = false

可能是时候阅读How to return the response from an asynchronous call?

我不知道这一直是真实的后果是什么,因为你没有完全分享你对这个结果的所作所为。

现在,如果您想“坚持使用手册”并保留async = true(您确实应该这样做),那么只需将以下代码包装在回调中即可。 E.g:

function fileExistsAsync(url, callback){
    var http = new XMLHttpRequest();
    http.open('HEAD',url,true);
    http.send();
    http.onreadystatechange = function () {
        if (http.readyState === 4) {
            callback(http.status != 404);
        }
    }
}

fileExistsAsync(url, function (exists) {
    console.log("async " + exists);
});

演示:http://jsfiddle.net/52xqLfow/