【问题标题】:Session in codeigniter not working wellcodeigniter 中的会话无法正常工作
【发布时间】:2015-07-02 06:32:39
【问题描述】:

我无法弄清楚 Codeigniter 中会话的实际错误是什么。我的另一个项目使用此代码运行良好。但在这种情况下,我遇到了问题。

对于登录会话,我的代码是:

 $data = array(
               'username' => $this->input->post('username'),
               'admin_logged_in' => true,
               'logged_in' =>true

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

我检查会话为:

 if ($this->session->userdata('admin_logged_in') == true) { 
     // code
    }

在进入控制器之前,我正在检查上面的会话,如果会话不正确,则重定向到登录页面。

注销:

 function logout() {
        if ($this->session->userdata('admin_logged_in') == TRUE) {
            $useremail = $this->session->userdata('username');
        $data = array(
                'username' => $useremail,
                'admin_logged_in' => true,
                'logged_in' =>true
            );
        $this->session->unset_userdata($data);
        $this->session->sess_destroy();
        redirect('login');
     }
  }

但上面的代码对我不起作用。当我注销时,页面成功重定向到注销页面,但会话没有被破坏,因为我可以访问所有需要会话集的页面。请帮我。

更新

我遇到了一个奇怪的问题。当我登录系统并注销时。并尝试访问需要会话的方法。如果我写了没有 index.php 的方法名,我可以访问。如果我用 index.php 编写方法名称,我将无法访问需要会话的方法。 例子: BnW 需要设置会话才能继续前进。 如果我登录并注销然后,如果我在以下 borwser URL 中写入:

 example.com/index.php/bnw      //it redirects to login page.
 example.com/bnw                //it logs in directly.
  • 从 .htaccess 中删除 index.php 是否会给会话带来问题?

【问题讨论】:

  • 在您的config.php 文件集$config['sess_time_to_update'] = 0; 中尝试
  • 我看到你同时使用 unset 和 destroy 只使用一个或其他

标签: php codeigniter session


【解决方案1】:

输入这个inside your logout function, 它对我有用

$user_data = $this->session->all_userdata();
        foreach ($user_data as $key => $value) {
            if ($key != 'session_id' && $key != 'ip_address' && $key != 'user_agent' && $key != 'last_activity') {
                $this->session->unset_userdata($key);
            }
        }
    $this->session->sess_destroy();

【讨论】:

  • 您可以在此之后访问所有会话变量或某些特定会话变量?
  • 是的,我可以访问。当我var_dump登录会话名称之前和之后的会话未设置。它在 unset 之前返回 true,在 unset 之后返回 false。但即使我可以直接从 URL 访问我的控制器的方法。
  • ok 尝试使用 $this->session->sess_expiration = '0' 动态地使会话过期;内部注销功能。
【解决方案2】:

config/autoload.php

$autoload['libraries'] = array('session');

您的 .htaccess 应该是(应该放在应用程序文件夹之外)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>

config/config.php

如果 2.0(第 247 行)

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = FALSE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 0;

如果 3.0(第 358 行)

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 0;
$config['sess_regenerate_destroy'] = FALSE;

在控制器中

function logout()
{
    $result = $this->model_name->check_login();
    if ( $result == TRUE )
    {

        if(!empty($log))
        {
            $this->session->sess_destroy();
            $this->index();//your logging should be here
        }
        else
        {
            //some code here
        }
    }
    else
    {
        $this->index();
    }
}

在模型中

public function check_login()
{
    $log = $this->session->all_userdata();

    if (isset($log['admin_logged_in']))
    {
        if($log['admin_logged_in'] == true)
        {
            return true;
        }
        else
        {
            return false;
        }
    } else
    {
        return false;
    }
}

每个控制器检查是否设置了会话。如果设置加载视图,否则直接到索引功能。所以这将阻止用户通过 URL 直接访问

检查登录的示例代码

$result = $this->model_name->check_login();
if($result==true)
    {
        //load your views as usual
    }
else
    {
        //load index function
        $this->index();
    }

索引函数(在控制器中)

public function index()
    {
        $this->load->view('admin/logging');//load your loginf view here
    }

【讨论】:

    【解决方案3】:

    我认为在您的 logout() 函数中,它不会进入 if 块内,因此会话根本不会被破坏

    documentation 中说

    注意:如果您正在尝试的项目,该函数将返回 FALSE(布尔值) 访问不存在。

    它没有说它返回 TRUE

    所以改变

    if ($this->session->userdata('admin_logged_in') == TRUE)
    

    if ($this->session->userdata('admin_logged_in') != FALSE)
    

    并检查你的会话在sess_destroy()之后是否真的被销毁了

     $this->session->sess_destroy();
     $admin_logged_in = $this->session->userdata('admin_logged_in');
     echo "-----------------> $admin_logged_in";
    

    【讨论】:

      猜你喜欢
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2015-05-10
      • 1970-01-01
      相关资源
      最近更新 更多