会话超时在网站中的工作方式


how the session time out works in websites

这里我发布了一个示例代码,它给出了正确的结果。这意味着如果我在60秒内不做任何操作,我就会自动从页面注销

<?php
session_start();
// set time-out period (in seconds)
$inactive = 600;
// check to see if $_SESSION["timeout"] is set
if (isset($_SESSION["timeout"])) {
    // calculate the session's "time to live"
    $sessionTTL = time() - $_SESSION["timeout"];
    if ($sessionTTL > $inactive) {
        session_destroy();
        header("Location: /logout.php");
    }
}
$_SESSION["timeout"] = time();

现在的问题是,在ISSET()函数中,我们正在计算$sessionTTL。现在我们有两个操作数,第一个是time(),它给出当前时间,第二个是$_SESSION["timeout],这个timeout也包含当前时间,所以两者的差值始终为零。那么,这个代码如何能够判断出我空闲了60秒,并能够破坏会话。请解释这背后的概念!

假设您是第一次调用该网站。我们假设当前时间戳是100。那么CCD_ 1的值将被设置为100。

请注意,time()$_SESSION["timeout"]的分配位于脚本的末尾

5秒钟后,用户点击一个链接,在这5秒钟后访问另一个页面。然后将执行脚本,并计算$sessionTTL = time() - $_SESSION["timeout"];。由于我们现在距离时间还有5秒,time()将返回105。但是,$_SESSION["timeout"]仍将包含100,因为它将在脚本结束时再次设置(脚本在执行过程中尚未达到)。然后差值将为5秒。由于5<600,则将不进行分支,并且$_SESSION["timeout"]可以再次被设置为当前时间(105)。

现在用户等待20分钟,也就是1200秒。然后他点击一个链接。

现在的数值是:

$_SESSION["timeout"]: 105
time(): 1305

因此,这次的差异将是1200,因此大于600,因此条件块将被执行,会话将被破坏。