2013-10-21 42 views
3

问题是,当我的会话过期时,我必须重新加载页面两次才能返回到登录页面。 这里是我的.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)当会话处于活动状态,一切工作正常 enter image description here

2)会话过期 - 用户点击链接或刷新页面(第一次刷新后) ,你可以在Firebug登录发现使用的是默认php.ini设置(会话有效期时加载,但第二次刷新后网页不会显示 enter image description here

3) enter image description here

一件事是..: 1440秒)everthing正常工作没有问题重定向

+0

你能告诉我们你已经到位的代码到期吗? – Jonathon

+0

你好朋友,首先感谢你的时间!我不确定我是否理解你的问题,但会话过期时间是通过.htaccess文件'php_value session.gc_maxlifetime 5'设置的。我没有任何特定的代码来检查会话是否过期。我必须手动检查它吗?我认为gc_maxlifetime会完成这项工作.. –

回答

0

我发现是什么原因造成的错误,但我不知道是什么原因是它造成这种一个愚蠢的错误。 我之前在我的代码中使用了session_set_cookie_params(0);,而当我的浏览器一直打开时,我改变了我的代码,删除了session_set_cookie_params(0);并添加了php_value session.gc_maxlifetime 5。这就是导致冲突的原因。一方希望会话持续到5秒后浏览器关闭和其他方终止会话。我清除了100次缓存,但没有发生任何事情,直到我关闭浏览器并重新打开项目。

0

我认为你必须创建一个注销函数,你必须写会话销毁,然后重定向。所以当用户点击他的注销链接时,你可以销毁他的会话变量,然后再重定向到登录页面。

如果您正在使用AJAX回调销毁会话,那么你必须刷新页面的JavaScript重定向用户到登录页面

+0

注销并不是问题,注销可以正常工作,但是当用户处于非活动状态并且会话过期并且例如他回来并按F5时,他不会被重定向到登录页面,他需要再次按F5才能返回到登录页面。 –

+0

在这种情况下,如果会话过期,您必须检查每个ajax请求的会话,您必须具有逻辑以再次显示登录弹出窗口。 –

+0

刚刚发生的奇怪的事情,我从昨天开始对我的项目没有做任何事情,今天我重新开放它,一切都按照它应该的方式工作。顺便说一句,因为即时通讯使用MVC,每个Ajax调用都是通过控制器来检查会话是否处于活动状态 –