【问题标题】:PHP session logs out before session cookie expiresPHP 会话在会话 cookie 过期之前注销
【发布时间】:2019-01-23 14:15:26
【问题描述】:

我已将 cookie 生命周期设置为持续一整天,但在 15-20 分钟的空闲时间后,我还是会退出。最奇怪的是,在 localhost 上一切正常,但是当我上线我的网站时,我开始使用相同的代码遇到这个问题。

我在 stackoverflow 上读到它可能与 session.gc_maxlifetime 相关,所以我什至在 .htaccess 级别上对其进行了编辑。我已经把它从1440改成了86400,但是问题依旧。

这是我的代码的概要。

当用户登录时,我会检查用户是否已经拥有一个名为“AUTHID”的 cookie。如果用户这样做,我先删除它。

if (isset($_COOKIE['AUTHID'])) {
        unset($_COOKIE['AUTHID']);
        setcookie('AUTHID', null, -1, '/');
    }

之后,根据用户是否选择记住我选项,我设置了 cookie 的生命周期值,它会创建一个我可以在 Chrome 设置中看到的 cookie,并且具有绝对正确的过期时间。

session_name('AUTHID');
ini_set('session.cookie_httponly', 1);

if(isset($_POST['remember-me'])) {
    ini_set('session.gc_maxlifetime', 604800);
    session_set_cookie_params(604800,"/");
} else {
    ini_set('session.gc_maxlifetime', 86400);
    session_set_cookie_params(86400,"/");
}

session_start();

最后,我有一个 php 函数来检查用户是否在每个页面上都登录:

$rel_url = "$_SERVER[REQUEST_URI]";
session_name('AUTHID');
session_start();
if(!isset($_SESSION['user_id'])) {
    if (strpos($rel_url, 'login=success') !== false) {
        header('Location: index.php');  
    }
    header('Location: login-with-bg.php?access-denied=logged-out');
    exit();
} 

这在我的本地主机上工作得很好,但是当我在我的托管服务器上上传这段代码时,即使 cookie 仍在以正确的到期日期创建,但如果我的浏览器空闲 15-20 分钟,我的会话就会得到时间到。

编辑:从一篇文章中,我想到了每 10 分钟左右进行一次 AJAX 调用,并且在浏览器打开时有效。但是,我需要一个完整的方法,即使浏览器关闭也能正常工作。

EDIT2:用于保持会话活动的 AJAX 代码:

function keep_alive() {
    $.get('index.php',null)
}
keep_alive_interval = setInterval(keep_alive, 600000)

【问题讨论】:

    标签: php session cookies session-cookies


    【解决方案1】:

    一些注意事项:

    • Session 和 ajax 是一件棘手的事情。确保在进行 ajax 调用时关闭会话,以便将更改写入会话。 (register_shutdown_function("session_write_close");)

    • 在这种情况下,更改会话名称没有实际用途(默认会这样做)。

    • AUTHID cookie 存储与您的会话相对应的 session_id。这也必须设置。无需手动设置cookie

    这在服务器上对我有用,但在本地机器上不起作用

    if ($_SERVER['SERVER_ADDR'] != '127.0.0.1'){ // Only use custom session on server. use default settings on local machine
    
        register_shutdown_function("session_write_close"); // write your changes done with ajax before your session opens again
    
        // some security settings
        ini_set("session.use_strict_mode", 1);
        ini_set("session.cookie_httponly", 1);
        ini_set("session.cookie_secure", 1);
        ini_set("session.use_only_cookies", 1);
    
        ini_set("session.gc_maxlifetime",60 * 60 * 24 * 14); // 2 weeks
        session_set_cookie_params(60 * 60 * 24 * 14,"/",".yourdomain.com"); // 2 weeks
    
        session_name("AUTHID");
        if(isset($_COOKIE['AUTHID'])){
           session_id($_COOKIE['AUTHID']);
        }
    }
    session_start(); 
    

    【讨论】:

    • 谢谢你,大安。我对您的代码进行了一些改进,例如 cookie_secure 和严格模式。但是,这并没有帮助我解决问题。此外,我还粘贴了用于保持会话活动的 AJAX 代码。让我知道在这种情况下我是否也必须使用 register_shutdown_function。
    • 您不应该使用 ajax 来保持会话活动。这意味着您的会话设置有其他问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2019-10-11
    • 2017-01-26
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多