会话超时并锁定在不同的浏览器上

时间:2015-10-27 20:21:55

标签: php session timeout

我已经查看了一些以前回答过的问题,但这些解决方案似乎对我不起作用。

所以我有一个简单的登录脚本,如下所示:

的login.php

// If page requires SSL, and we're not in SSL mode, 
// redirect to the SSL version of the page
if($_SERVER['SERVER_PORT'] != 443) {
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
   exit();
}
// put sha1() encrypted password here
$password = 'sha1passwordgoeshere';

session_start();
if (!isset($_SESSION['loggedIn'])) {
    $_SESSION['loggedIn'] = false;
}

if (isset($_POST['password'])) {
    if (sha1($_POST['password']) == $password) {
        $_SESSION['loggedIn'] = true;
    } else {
        $logFailure = true;
    }
} 

if (!$_SESSION['loggedIn']): 
// Load Login Page
exit();
endif;

logout.php

// If page requires SSL, and we're not in SSL mode, 
// redirect to the SSL version of the page
if($_SERVER['SERVER_PORT'] != 443) {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit();
}

// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();

// Unset all of the session variables.
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// Finally, destroy the session.
session_destroy();

我的其余页面包含文件顶部的login.php。

大多数时候,一切似乎都很好。但是,我一直注意到,因为我已经转移到一个新的服务器,并使用PHP 5.6.14,我不时被定时。

例如,现在我可以使用Internet Explorer登录,但我无法使用Firefox或Chrome。如果我清除cookie,我可以使用Firefox和Internet Explorer登录,但不能登录Chrome。

更新

我可以通过成功登录,立即注销,然后再次登录来立即导致超时。在第二次登录时,它会超时。

这真让我感到沮丧,我不是会议大师,所以我不明白为什么会以这种方式行事,或者如何解决它以使其不那么微妙。

我只使用会话来记录登录,而不是其他任何事情。我确实在网站的某些页面上使用AJAX,但不经常使用。

基本上,我从不希望这个超时。我该如何防止这些超时发生?

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。首先,我在注销页面上使用了一个表单按钮,允许用户重新登录。我用标准链接替换了它。

其次,登录后,登录页面有一段代码会在日志文件上创建错误警告,其中foreach期望一个数组(即使它是一个数组并正确输出)。删除该部分代码似乎解决了这个问题。我不确定这会如何导致问题。