0

嘿,伙计们帮我从所有视图页面注销。当我单击注销链接时,我只是从一个页面,而当我试图从另一个页面注销时,它不起作用。. 我的 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');
    }
4

5 回答 5

1

首先,codeigniter 不使用 php 本机会话,因此 session_destroy 将无法使用$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');
    }
}
于 2013-02-11T06:05:07.577 回答
1

我建议您阅读 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/');
    }
}

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

于 2013-02-11T09:01:04.437 回答
0

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

在那个函数中

 public function logout() {
       $this->session->session_destroy();
       redirect("home");
 }
于 2013-02-11T05:30:25.977 回答
0

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

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

  if (FALSE !== $this->session->userdata('logged_in')) {
       redirect('/user'); 
  }
于 2013-02-11T05:29:17.023 回答
0

尝试这个

 function logout()
        {
            $this->session->unset_userdata($session_data); 
            $this->session->sess_destroy();
            redirect('home', 'refresh');
        }
于 2013-02-11T06:46:53.727 回答