首先,我想解释一下我要完成的工作。
因此,我有一个系统,如果用户登录,其用户名将存储在$_SESSION['username']
中。在每个页面上,我都有session_start();
,然后经常查看if(isset($_SESSION['username']))
以显示不同的内容。
这一切都很好用,除了会话在超时之前到期或在超时之前未设置$_SESSION['username']
变量(导致系统认为用户需要注销)之外。我真的想补充一下,这种情况随机发生!
我可以在网站上花费10分钟,而互动之间的间隔是不同的,但没有任何反应,接下来我知道,我会在3分钟内被踢出两次。
我可以验证session.cookie_lifetime = 0
(这意味着它将在浏览器关闭之前不会过期)和session.gc_maxlifetime = 1200
(这无关紧要,因为我已将会话保存文件夹设置在与tmp不在同一位置。
我唯一想到的可能是一个问题,是在验证密码后在登录部分输入以下代码:
$_SESSION['username'] = $usernameInput;
session_write_close();
header("Location: index.php");
我知道使用标头意味着会话变量不会被保存,因为它剪切了文档,但这就是为什么我使用session_write_close();
保存这些变量的原因。并且请记住:此后一切正常!进入index.php后,我可以看到我的用户名。
有些SO线程会导致用户将会话变量和内容保存在数据库中,但是我宁愿对其进行修复而不必这样做。
编辑:
因此,我重新引入了一个为会话超时计数的函数,该方法行之有效,但是我发现了一个问题。我查看了浏览器的network
部分,并在XHR
中查找了会话以及cookie和其他内容。网站对我的logout.php
文件执行GET请求时,发生了一些奇怪的事情。
所以我研究了可能导致这种情况的原因。我有2个注销按钮,它们被PHP回显,并且给了它们每个不同的href链接。我将范围缩小到此PHP和HTML。上次我检查时,HTML不会自动转到其代码中的href。而且我怀疑PHP是否会这样做。
if(isset($_SESSION['username'])){
echo "<div class='navProfile navButton'><img class='navProfileIcon' src='images/angerypigeon.jpg' alt=''><h3 class='navProfileUsername'>" . $_SESSION['username'] . "</h3><h3 class='navProfilePosts'>Posts: 102</h3><a class='navProfileLogout' href='php_tools/logoutbutton2.php'>Logout</a></div>";
echo "<button class=\"modalButton upload navButton\" id=\"uploadButton2\" type=\"button\" name=\"button\" style=\"margin-left: auto\">Upload</button>";
}
else {
echo "<button class='navButton' type=\"button\" name=\"button\" onclick=\"location.href = 'login.php'\">Login</button>";
}
当我在浏览器中检查XHR字段时,它将发送针对logoutbutton2
的GET请求。
如何防止这种情况发生?我不自己单击按钮。它是随机发送的。
答案 0 :(得分:0)
由于我看不到所有代码,因此只能推测。 什么可能会在“随机”情况下终止会话。
也许你有
答案 1 :(得分:0)
首先,检查您的请求标头中是否正确设置了SET-COOKIE
。检查生存期(客户端)。
有时关于用户会话的文件未正确创建。检查您的session_save_path
并检查此文件夹是否创建了新文件。
答案 2 :(得分:0)
问题似乎已经解决。这确实是一个随机且不可预测的事情。