【问题标题】:PHP session expires but after page refresh I'm not redirectedPHP会话过期但页面刷新后我没有重定向
【发布时间】:2013-10-21 08:21:42
【问题描述】:

问题是,当我的会话到期时,我必须重新加载页面两次才能返回登录页面。 这是我的 .htaccess 文件

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 框架,并且我正在控制器中调用 handleLogin() 函数 __construct 函数

function __construct() {
    parent::__construct();
    Auth::handleLogin();
}

最后是handleLogin()函数

public static function handleLogin() {
    @session_start();
    if (isset($_SESSION['loggedIn'])) {
        $logged = $_SESSION['loggedIn'];
    } else {
        session_destroy();
        header('location: ' . URL . 'login');
        exit;
    }
}

会话到期时,在第一次刷新后,我需要更改什么以将用户重定向到登录页面?

提前致谢!

附:我在 Debian 上运行它

更新:这里是注销功能,它工作正常,当用户点击它时,他会立即重定向到登录页面

function logout()
{
    session_destroy;
    header('location: ' . URL .  'login');
    exit;
} 

更新 #2 我得到了一些截图以便更好地描述问题

1) 当会话处于活动状态并且一切正常时

2) 会话过期 - 用户点击链接或刷新页面(第一次刷新后) 正如您在 firebug 登录中注意到的那样,已加载但未显示

3) 第二次刷新后

还有一件事是.. 当使用默认 php.ini 设置(会话生命周期:1440 秒)时,一切正常,重定向没有问题

【问题讨论】:

  • 您能否向我们展示您为使会话过期而准备的代码?
  • 朋友您好,首先感谢您的宝贵时间!我不确定我是否理解您的问题,但会话到期时间是通过 .htaccess 文件php_value session.gc_maxlifetime 5 设置的。我没有任何特定的代码来检查会话是否过期。我必须手动检查吗?我认为 gc_maxlifetime 会完成这项工作..

标签: php .htaccess session model-view-controller


【解决方案1】:

我认为您必须创建一个注销功能,您必须在其中编写会话销毁然后重定向。因此,当用户单击他的注销链接时,您可以销毁他的会话变量,然后再次重定向到登录页面。

如果您使用 ajax 回调来销毁会话,那么您必须在 javascript 中刷新页面以将用户重定向到登录页面

【讨论】:

  • 注销没问题,注销工作正常,但是当用户处于非活动状态并且会话到期时,例如他回来并按F5,他不会重定向到登录页面,他需要再次按F5返回登录页面。
  • 在这种情况下,如果会话过期,您必须检查每个 ajax 请求的会话,您必须有逻辑再次显示登录弹出窗口。
  • 刚刚发生了奇怪的事情,从昨天开始我的项目什么也没做,今天我重新打开它,一切正常。顺便说一句,因为我使用 MVC,所以每个 ajax 调用都通过控制器检查会话是否处于活动状态
【解决方案2】:

我找到了导致错误的原因,但我不确定为什么会导致如此愚蠢的错误。 我的代码前面有session_set_cookie_params(0);,当我的浏览器一直打开时,我更改了我的代码,删除了session_set_cookie_params(0);并添加了php_value session.gc_maxlifetime 5。这就是引起冲突的原因。一方预期会话将持续到浏览器关闭,另一方在 5 秒后终止会话。我清除了缓存 100 次,但在我关闭浏览器并再次重新打开项目之前什么都没有发生。

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 2015-01-03
    • 2018-02-04
    • 2017-03-03
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多