簡體   English   中英

Codeigniter中的會話無法正常運行

[英]Session in codeigniter not working well

我無法弄清楚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需要設置會話才能繼續。 如果我登錄然后注銷,那么,如果我在瀏覽器URL中寫以下內容:

 example.com/index.php/bnw      //it redirects to login page.
 example.com/bnw                //it logs in directly.
  • 從.htaccess中刪除index.php會給會話帶來問題嗎?

將其inside your logout function,對我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();

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
    }

我認為在您的logout()函數中,它不會進入if塊內,因此會話根本不會被破壞

在說明文件中

注意:如果您嘗試訪問的項目不存在,則該函數返回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";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM