【问题标题】:Session data lost automatically without click logout in codeigniter会话数据自动丢失,无需在 codeigniter 中单击注销
【发布时间】:2013-04-17 11:35:32
【问题描述】:

我有一个使用 codeigniter 的 web 应用程序,用户大约 200 个。如果大约 100 个用户同时登录系统,有时用户会自动注销或重定向到登录页面而无需单击注销。

我的代码。

登录助手(加载 Construst 以检查登录与否)

function is_logged_in()
{
    //Get Codeigniter Instance
    $obj =& get_instance();

    $is_logged_in = $obj->session->userdata('LOGGED_IN');

    if(!isset($is_logged_in) || $is_logged_in != true)
    {   
        $obj->session->set_flashdata('message','<div class="error_login"><b>ERROR:</b> Silahkan login terlebih dahulu.</div>');

        //If no session, redirect to login page
        redirect('login', 'refresh');
    }

 }

控制器。

public function verify()
{
    $username = $this->input->post('username');
    $password = $this->input->post('password');

    //Query the database
    $row = $this->Loginmodel->verify($username,$password);

    if (count($row)) {

        $dataSession = array(
            'userid' => $row->userid,
            'role' => $row->role,
            'prov_cd' => $row->prov_cd,
            'kab_cd' => $row->kab_cd,
            'LOGGED_IN'=> true,
            'MODAL'=> true
        );

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

        redirect('dashboard','refresh');

    } 
    else
    {
         $this->session->set_flashdata('message','<div class="error_login"><b>ERROR:</b> Username atau password salah.</div>');
         redirect('login','refresh');
    }

}

我认为这是因为我在会话数据中存储了许多参数。谢谢。

【问题讨论】:

    标签: php codeigniter session session-variables


    【解决方案1】:

    看看你的 count($row) 你能指定它是什么

    COUNT($row) == 1
    

    所以我有点理解您要做什么,如果 $row 返回计数为 0 则用户名密码未验证,如果它返回单个用户示例

    == 1
    

    那么用户名是正确的并进行了验证。试试这个解决方案。

    根据 php 文档,它不会返回布尔值 true 或 false。请尝试一下。还有你遇到了什么错误?

    为了进一步实现,我引用了“计算数组中的所有元素或对象中的某些内容”。所以只是打电话

    COUNT($row) { // If it is true or not will not work
    

    我怀疑您必须明确说明计数是否 == 1,然后是的,我们确实得到了查询的返回,让该人继续。

    好吧,我也会从 CI 的角度进一步扩展这个主题!

    我怀疑您也没有检查是否设置了会话......我建议创建一个 MY_Controller 情况。这很容易,并且会为...减少麻烦。

    请看一下这段代码:

    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    
    class MY_Controller extends CI_Controller { // Create your custom controller
        public function __construct() {
            parent::__construct();
        }
    }
    

    然后在同一个文件中执行以下操作:

    class MY_logincontroller extends MY_Controller { // 扩展你上面创建的类

    public function __construct() { 
        parent::__construct();
        $this -> load -> model('login_model'); // Load your login model
        $loggedin = $this -> session -> userdata('loggedin'); // set your user information
        $username = $this -> session -> userdata('username'); // Set your user information
    
        if ((!isset($loggedin)) || ($loggedin != TRUE)) { // This will check if the the session variable is set or if it is equal to logged in, if not it will send to a access denied page
            $this -> session -> unset_userdata('loggedin'); // If access denied happens unset user data logged in (just to be sure) and destroy all other session stuff
            $this -> session -> sess_destroy();
            $this -> load -> view('messages/accessdenied_view');
            $this -> output -> _display();
            die();
        }
        $this -> output -> set_header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
        $this -> output -> set_header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
        $this -> output -> set_header('Pragma: no-cache');
        $this -> output -> set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    }
    

    希望这可以为您解决一些问题

    【讨论】:

    • 好的,我试过了。谢谢。但是,是否是导致会话数据自动丢失的原因?谢谢。
    • 我怀疑你的 if 语句是失败的时期。因为您正在检查 COUNT($row) 是否为 TRUE。看看你的配置文件检查过期。假设您的编码人员没有错误地销毁会话数据(一旦您实施了适当的身份验证系统),则不应销毁它。
    • 我认为您没有检查会话是否存在,我更新了我的答案。我发布的代码也应该放在 application/core
    • $this -> session -> unset_userdata('loggedin'); // 如果访问被拒绝,未设置登录的用户数据(只是为了确定)并销毁所有其他会话内容 $this -> session -> sess_destroy(); $this -> load -> view('messages/accessdenied_view'); $this -> 输出 -> _display();死();我不明白那个拆分代码?我为什么要使用它?谢谢。
    • 首先,我总是手动取消设置我设置的会话数据。然后我调用 session destroy 来为我做剩下的事情。在 codeigniter 中,如果你只放 die() 然后 Access Denied 你会得到一个白屏,因为它会杀死或“die()'s”脚本。所以一旦你做了重定向,那么你必须在调用 die() 函数之前显示重定向。这只是为了确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多