带有 Codeigniter 会话到期时间的帮助

Posted

技术标签:

【中文标题】带有 Codeigniter 会话到期时间的帮助【英文标题】:Help w/ Codeigniter session expiration time 【发布时间】:2011-05-10 13:10:05 【问题描述】:

我想在 Codeigniter 中动态设置会话过期时间。我正在自动加载会话类。我有一个视图,其中包含供用户单击的复选框(记住我)。现在,如果他们单击复选框或没有过期时间保持不变:/


    // Config.php
    $config['sess_expiration']      = 7200;

    // Controller
    if ($this->input->post('remember_me') == 'TRUE')
    
    $this->session->remember_me();
    

    $newdata = array(
    'failed_login'  => 0,
    'user_name'  => $this->input->post('user_name'),
        'logged_in' => TRUE
    );

    $this->session->set_userdata($newdata);

    // MY_Session.php
    class MY_Session extends CI_Session 

    function remember_me()
    
        $this->sess_expiration = 172800;
    

    

【问题讨论】:

【参考方案1】:

如果您需要实现“记住我”功能 - 那么您的启动方式错误。

您需要再创建一个包含字段user_id | token 的数据库表。

然后,在用户登录后(选中“记住我”复选框) - 生成随机令牌并插入具有当前 user_id 和该令牌的新行。另外 - 使用相同的令牌值设置 remember cookie。

现在,如果用户进入您的网站,但没有经过身份验证并且有一些令牌 - 您总是可以找到该令牌并验证用户(每个令牌都是唯一的,并且与特定的 user_id 密切相关)。

【讨论】:

【参考方案2】:

这是我一直在使用的解决方案。

您可以在 domain.com/system/libraries/Session.php 中编辑函数

function _set_cookie($cookie_data = NULL)

注释掉

// $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time();

然后添加

    if(isset($this->userdata['rememberme']))
        // If they want to stay connected
        if( $this->userdata['rememberme'] == 1) 
            $expire = 0;
         else 
            $expire = time() + $this->sess_expiration;
        
     else 
        $expire = time() + $this->sess_expiration;
    

如果这有帮助,请告诉我,或者修改我的代码来帮助我。谢谢。

【讨论】:

【参考方案3】:
$data = array(
    'username' => $this->input->post('username'),
    'ADMIN_is_logged_in' => true
);

$this->session->sess_expiration = '14400';// expires in 4 hours
$this->session->set_userdata($data);// set session

【讨论】:

以上是关于带有 Codeigniter 会话到期时间的帮助的主要内容,如果未能解决你的问题,请参考以下文章

手动设置会话过期时间-CodeIgniter

如何以角度处理会话到期?

Codeigniter 中的会话变量不工作

在 Windows 身份验证中重定向到有关会话到期的公共页面

CodeIgniter 3 会话在页面刷新后销毁

我对 PHP 会话的理解正确吗?