【问题标题】:codeigniter sess_destroy() not working properly,what m i doing wrong?codeigniter sess_destroy() 无法正常工作,我做错了什么?
【发布时间】:2012-01-26 13:47:02
【问题描述】:

我是 codeigniter 的新手。我正在使用登录表单以管理员身份登录。当管理员使用正确的用户名和密码登录时,他/她会被引导到带有会话变量的主页。然后如果他单击注销按钮,则会话应该被破坏并将用户重定向到登录页面即登录表单页面。

第一个控制器是管理员:

<?php
class Admin extends CI_Controller
{
    function index()
    {
        $data['main_content'] = 'admin/log_in';
        $this -> load -> view('includes/admin/admin_template', $data);
    }
    function log_in()
    {
        $this->load->model('admin_model');
        $query = $this -> admin_model -> validate();
        if ($query)// if the user's credentials validated...
        {
            $data = array('user_name' => $this -> input -> post('user_name'), 'is_logged_in' => true);
            $this -> session -> set_userdata($data);
            redirect('admin/home/admin_home');
        } else// incorrect username or password
        {
            $this -> index();
        }
    }
    function log_out()
    {
        $this->session->sess_destroy();
        redirect('/admin/admin','refresh');
    }
}

第二个控制器是家庭控制器:

<?php
class Home extends CI_Controller
{
    function __construct()
    {
        parent:: __construct();
        $this->is_logged_in();
    }
    function is_logged_in() 
    {
        $is_logged_in = $this -> session -> userdata('is_logged_in');
        if (!isset($is_logged_in) || $is_logged_in != true)
        {
            $this -> load -> view('admin/forbidden');
        }
    }
    function admin_home()
    {
        $data['main_content'] = 'home_view';
        $this->load->view('admin/home_view');
    }
}

模型是admin_model:

<?php
class Admin_model extends CI_Model
{
    function __construct()
    {
        parent:: __construct();
    }
    function validate()
    {
            $this->db->where('user_name',$this->input->post('user_name'));
            $this->db->where('password', $this->input->post('password'));
            $query = $this->db->get('user');
            if($query->num_rows==1)
            {
                return true;
            }
    }
}

现在,它假设用户注销并销毁会话,但是如果我单击浏览器的后退按钮,我可以返回不应该的页面并且会话不会被破坏。 请告诉我我在这里做错了什么。我正在使用 codeigniter 2.1.0。

【问题讨论】:

  • 点击后退按钮后,您是否正在从缓存中检索页面?或者,如果您点击F5,页面是否会重新加载并显示您已登录?
  • 是的,即使重新加载后显示我已登录
  • 如果您在另一个浏览器中打开一个“安全”页面(没有会话数据),您也会进入吗?
  • 遇到错误不允许您请求的操作。---如果我这样做,则会显示此错误消息。
  • $this -&gt; load -&gt; view('admin/forbidden');的输出错误吗?这些东西你要清楚。

标签: session-variables codeigniter-2


【解决方案1】:

如果您注销,那么尽管会话被销毁,会话用户数据保留在当前 CI 页面构建期间。

作为预防措施,您应该这样做:

function log_out()
{
    $this->session->sess_destroy();
    // null the session (just in case):
    $this->session->set_userdata(array('user_name' => '', 'is_logged_in' => ''));

    redirect('/admin/admin');
}

见:http://codeigniter.com/forums/viewthread/110993/P130/#662369

【讨论】:

  • 谢谢,但它不起作用。我仍然面临同样的问题:(
  • 您有什么理由进行“刷新”重定向?为什么不做一个基于位置的,只做redirect('/admin/admin'); 这可能是问题的根源,如果所有其他方法都失败了,启用$this-&gt;output-&gt;enable_profiler(TRUE); 看看发生了什么。
【解决方案2】:

在经历了所有的麻烦并在各个地方搜索之后,我终于找到了解决这个问题的正确方法。问题出现是因为浏览器正在显示缓存的页面。不是会话造成了问题,而是好好工作。 这是解决方案: 在家庭控制器中添加一个函数来清除缓存并在构造函数中调用它就可以了:) 这是带有解决方案的家庭控制器:

<?php
class Home extends CI_Controller
{
    function __construct()
    {
        parent:: __construct();
        $this->is_logged_in();
        $this->clear_cache();
    }
    function is_logged_in() 
    {

        if (!$this->session->userdata('is_logged_in'))
        {
            redirect('/admin/admin');
        }
    }
    function clear_cache()
    {
        $this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0");
        $this->output->set_header("Pragma: no-cache");
    }
    function admin_home()
    {
        $data['main_content'] = 'home_view';
        $this->load->view('admin/home_view');
    }
}

现在感谢这个链接“logout feature in code igniter”,这是我找到解决方案的地方,它工作得很好:)

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 2012-04-15
    • 1970-01-01
    • 2021-09-07
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多