如何从codeigniter中的所有视图注销,我是否使用了错误的代码


how to logout from all views in codeigniter , am i using wrong code?

嘿,伙计们帮我从视图的所有页面注销。。当我点击登出链接时,我只从一个页面登出,而我正试图从另一个页面注销,这是不起作用的。我的cpntoller代码是:-

function index()
    {
        if($this->session->userdata('logged_in'))
        {
            $session_data = $this->session->userdata('logged_in');
            $data['email'] = $session_data['email'];
            $this->load->view('home_view', $data);
            $this->load->view('home_content_view', $data);
        }
        else
        {
            //If no session, redirect to login page
            redirect('login', 'refresh');
        }
    }
    function logout()
    {
        $this->session->unset_userdata('logged_in');
        session_destroy();
        redirect('home', 'refresh');
    }

首先,codeigniter不使用php本机会话,因此session_delete无法使用$this->session->sess_destroy()。在每个控制器的构造函数中(如果您有多个控制器)。如果用户会话不存在,请检查该会话,然后将用户重定向到要显示的页面。

class Home extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        //this condition checks the existence of session if user is not accessing  
        //login method as it can be accessed without user session
        if( !$this->session->userdata('logged_in') && $this->router->method != 'login' ) {
            redirect('login'); 
        }
    }
    function index()
    {
        $session_data = $this->session->userdata('logged_in');
        $data['email'] = $session_data['email'];
        $this->load->view('home_view', $data);
        $this->load->view('home_content_view', $data);
    }
    function logout()
    {
        $this->session->userdata = array();
        $this->session->sess_destroy();
        redirect('home', 'refresh');
    }
}

我建议您阅读CodeIgniter中的_remap()函数。我通常对登录/注销所做的是覆盖我的自定义控制器中的重映射,该控制器扩展了CI_controller,并执行以下操作:

function _remap($method)
{
    if (method_exists($this, $method) && $this-my_custom_helper->is_logged_in())
    {
        $this->$method();
    }
    else
    {
        redirect('/auth/login/');
    }
}

这样,您就不需要检查每个控制器中是否存在loggedin。另一件有用的事情是实现一个before/after过滤器,该过滤器在每个控制器中的操作之前运行。我不想详细介绍,但你可以在这里查看Jamie Rumbewer的MY_Controller。你可以从他的代码中采用一些不错的技术。祝你好运

在每个控制器的构造函数__construct中放入以下方法。

我假设您在用户控制器的索引功能上有登录方法

  if (FALSE !== $this->session->userdata('logged_in')) {
       redirect('/user'); 
  }

当用户单击注销按钮时,cal将转到控制器文件中的注销功能。

在该功能中

 public function logout() {
       $this->session->session_destroy();
       redirect("home");
 }

试试这个

 function logout()
        {
            $this->session->unset_userdata($session_data); 
            $this->session->sess_destroy();
            redirect('home', 'refresh');
        }