1

我正在使用CodeIgniter

登录会员后,点击退出后,点击返回按钮,仍然可以查看会员页面。

问题 有谁知道,如果用户已经登出,即使点击后退按钮也无法访问会员页面?

请在下面查看我的代码..

谢谢..

    class Site extends CI_Controller{

    function index()
    {   
        if(!isset($this->session->userdata['is_loggged_in'])) 
            $this->login(); 
        else 
            $this->_template();      
    }

    function login()
    { 
        $data['main_content'] = 'login_form';
        $data['page_title']   = 'Login - php';
        $this->load->view('include/template' , $data);  
    }

    function validate()
    {  
        $this->load->library('form_validation'); 
        $this->form_validation->set_rules('username' , 'Username' , 'trim|required' );
        $this->form_validation->set_rules('password' , 'Password' , 'trim|required' ); 

        if($this->form_validation->run() == FALSE)
        {
            $this->login();
        } 
        else
        { 
            $this->load->model('member_model' , 'member');
            $query = $this->member->checklogin(); 

            //login successful , make sure no duplicate entry during registration
            if($query->num_rows() == 1)
            {
                $data = array(
                    'is_loggged_in' => TRUE ,
                    'username'      => $this->input->post('username'), 
                );
                $this->session->set_userdata($data);
                $this->_template();
            }
            else
            { 
                $data = array(
                        'main_content' => 'login_form' ,
                        'page_title'   => 'Error login' ,
                        'page_error'   => 'Invalid Username or password. '

                );
                $this->load->view('include/template' , $data); 
            }

        }
    }

    function _template()
    { 
        $data = array(
            'main_content' => 'include/default_inc',
            'page_title'   => 'Welcome home ran'
        ); 

        $this->load->view('include/template' , $data);  
    }

    function logout()
    { 
        $this->session->sess_destroy();
        redirect('site/login');
        exit;
    }
  }

/* end of controller site */
4

5 回答 5

2

这是逻辑

如果您在所有控制器中禁用缓存,它会起作用,但它很愚蠢。也许它会减慢您的网络负载,甚至影响您的 SEO。

所以解决方案是始终检查每个页面中的用户状态,如果他的状态已登录则禁用缓存,否则什么也不做

这是我在每个函数中放入的代码的示例部分

if ($this->session->userdata('logged_in')){
     $this->output->set_header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
     $this->output->set_header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0');
     $this->output->set_header('Cache-Control: post-check=0, pre-check=0', FALSE);
     $this->output->set_header('Pragma: no-cache');}

无需在此之后添加 else 语句,只需输入其余代码即可。

因此,用户登录 id 并浏览您的网络时,没有存储缓存。尝试注销并点击返回按钮。我打赌它有效

于 2014-03-08T23:13:18.337 回答
2

假设您的会话已成功销毁,但仍可以访问前一页(来自浏览器的历史记录),那么您可以通过在每个controllers constructor. 我建议扩展核心Output库。

    $this->output->set_header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
    $this->output->set_header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0');
    $this->output->set_header('Cache-Control: post-check=0, pre-check=0', FALSE);
    $this->output->set_header('Pragma: no-cache'); 
于 2013-10-29T08:41:10.387 回答
1

基本上,您的浏览器会返回一个页面并简单地复制它当时收到的 HTML。有很多方法可以解决这个问题,我保证您可以通过少量搜索轻松找到它们。

防止这种情况的一种简单方法是在页面加载时运行 ajax 来检查您是否已登录,如果不是这样,则更新页面。并且 ajax 将始终运行,即使通过使用 Back。

控制器/check_login.php

<?

class Check_login {

    function index()
    {
        $bool = (bool) $this->session->userdata('is_loggged_in');

        $this->output->set_content_type('application/json');
        if ($bool)
            $this->output->set_status_header('500');

        $arr_json = array( 'need_login' => $bool);

        echo json_encode($arr_json);
    }

}

jQuery的

$(function() {

    $(document).ajaxError(function(event, jqXHR) {

        var data    =   jqXHR.responseJSON;

        if (data.need_login)
            if (confirm(data.message))
                window.location = window.location.href;

       $.get('/check_login');

    });

});

笔记!$this->input->is_ajax_request()这种方法还可以通过巧妙地使用和'need_login'值,为您提供一种处理无效 ajax 调用的简单方法。

于 2013-10-29T08:37:35.137 回答
1

从您的代码中,您已注销,甚至浏览器缓存了 html 页面,因此会出现此类问题。我正在提供一个经过良好测试的解决方案。.把下面的代码放在你的助手中(比如说my_helper.php)。

function no_cache()
{
    header("Expires: Mon, 26 Jul 1990 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
}

加载帮助程序并在控制器的构造函数中调用 no_cache 函数

public function __construct()
{
    parent::__construct();
    $this->load->helper('my_helper');
    no_cache();

}
于 2013-10-29T08:43:41.913 回答
1

而不是在索引函数中检查会话尝试在构造函数中检查它

function __constuctor()
{   
    parent::__construct();
    $session = $this->session->userdata('is_loggged_in');
    if ( !$session) {
        $this->login(); 
    }else{
        $this->_template();    
    }     
}
于 2013-10-29T08:06:16.493 回答