【发布时间】:2014-03-05 03:30:55
【问题描述】:
我正在构建一个 Web 应用程序,它允许用户登录到数据库后端并更新一些记录。无论如何,我都不是专业的 PHP 开发人员。
我刚刚注意到,在打开 Chrome 浏览器后,它会转到几天前的最后一页(中间有重新启动),这是您只能访问的网站页面之一登录后。我觉得这很奇怪,因为会话现在应该已经过期了。
在每个页面的顶部我有:
session_start();
如果用户成功登录到后端,我会设置一个会话变量,如下所示:
$_SESSION['userAuthenticated'] = TRUE;
如果用户点击注销按钮,它会这样做:
$_SESSION = array();
session_unset();
session_destroy();
在我的 php.ini 文件中,我设置了以下内容:
session.cookie_lifetime 0 (0 for both local value and master value)
session.gc_maxlifetime 900 (900 for both local value and master value)
据我了解,如果用户完全退出浏览器,会话将保持活动 15 分钟并被销毁。我刚刚对此进行了测试,我可以完全退出浏览器,再次打开它并访问需要登录的页面之一。
我在这里做错了吗 - 我不能总是期望用户单击“注销”按钮,但我希望会话在 15 分钟后或如果他们完全退出浏览器时无法工作。
更新:这是我检查用户是否已通过身份验证的方式:
if (!isset($_SESSION['userAuthenticated']) and $_SESSION['userAuthenticated'] !== TRUE) {
header('Location: index.php');
die;
}
【问题讨论】:
-
$_SESSION = array();不是必需的。另外,请说明您如何检查$_SESSION['userAuthenticated']以验证用户是否登录。 -
您可能正在从缓存中加载页面。刷新后是否仍显示为已登录?
-
@Raptor - 我正在使用它来验证用户是否经过身份验证: if (!isset($_SESSION['userAuthenticated']) 和 $_SESSION['userAuthenticated'] !== TRUE) { header('位置:index.php');死; }
-
@Mike 是的,如果我刷新或导航到另一个页面,它可以工作 - 每个页面都必须访问后端数据库来检索数据,因此如果它们没有经过身份验证,它将无法工作
-
@user982124 而不是使用
and使用or。例如,如果您将$_SESSION['userAuthenticated']设置为false,则使用您现在拥有的代码,用户将登录。