我将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生存期值,并创建了一个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)
答案 0 :(得分:0)
一些注意事项:
会话和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();