PHP会话过期但页面刷新后我没有重定向
问题是,当我的会话过期时,我必须重新加载页面两次才能返回到登录页面。 这里是我的.htaccess文件PHP会话过期但页面刷新后我没有重定向
php_flag display_errors on
php_value error_reporting 9999
RewriteEngine On
Options -MultiViews
AddDefaultCharset UTF-8
php_value session.gc_maxlifetime 5
php_value session.gc_divisor 1
php_value session.gc_probability 1
php_value session.cookie_lifetime 5
php_value session.save_path /path/to/session/folder
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
我使用一些自定义的MVC框架,我在控制器__construct功能
function __construct() {
parent::__construct();
Auth::handleLogin();
}
最后这里是handleLogin调用handleLogin()()函数中
public static function handleLogin() {
@session_start();
if (isset($_SESSION['loggedIn'])) {
$logged = $_SESSION['loggedIn'];
} else {
session_destroy();
header('location: ' . URL . 'login');
exit;
}
}
当会话过期后,我需要更改重定向用户到登录页面后FIRST刷新?
在此先感谢!
P.S.我运行它在Debian
更新:这里是注销功能,并能正常工作,当用户点击它他immidiately重定向到登录页面
function logout()
{
session_destroy;
header('location: ' . URL . 'login');
exit;
}
更新#2我得到了一些截图很好的解决问题说明
1)当会话处于活动状态,一切工作正常
2)会话过期 - 用户点击链接或刷新页面(第一次刷新后) ,你可以在Firebug登录发现使用的是默认php.ini设置(会话有效期时加载,但第二次刷新后网页不会显示
3)
一件事是..: 1440秒)everthing正常工作没有问题重定向
我发现是什么原因造成的错误,但我不知道是什么原因是它造成这种一个愚蠢的错误。 我之前在我的代码中使用了session_set_cookie_params(0);
,而当我的浏览器一直打开时,我改变了我的代码,删除了session_set_cookie_params(0);
并添加了php_value session.gc_maxlifetime 5
。这就是导致冲突的原因。一方希望会话持续到5秒后浏览器关闭和其他方终止会话。我清除了100次缓存,但没有发生任何事情,直到我关闭浏览器并重新打开项目。
我认为你必须创建一个注销函数,你必须写会话销毁,然后重定向。所以当用户点击他的注销链接时,你可以销毁他的会话变量,然后再重定向到登录页面。
如果您正在使用AJAX回调销毁会话,那么你必须刷新页面的JavaScript重定向用户到登录页面
注销并不是问题,注销可以正常工作,但是当用户处于非活动状态并且会话过期并且例如他回来并按F5时,他不会被重定向到登录页面,他需要再次按F5才能返回到登录页面。 –
在这种情况下,如果会话过期,您必须检查每个ajax请求的会话,您必须具有逻辑以再次显示登录弹出窗口。 –
刚刚发生的奇怪的事情,我从昨天开始对我的项目没有做任何事情,今天我重新开放它,一切都按照它应该的方式工作。顺便说一句,因为即时通讯使用MVC,每个Ajax调用都是通过控制器来检查会话是否处于活动状态 –
你能告诉我们你已经到位的代码到期吗? – Jonathon
你好朋友,首先感谢你的时间!我不确定我是否理解你的问题,但会话过期时间是通过.htaccess文件'php_value session.gc_maxlifetime 5'设置的。我没有任何特定的代码来检查会话是否过期。我必须手动检查它吗?我认为gc_maxlifetime会完成这项工作.. –