如何解决post_controller_constructor在CodeIgniter中挂钩重定向问题

时间:2013-09-21 07:01:52

标签: codeigniter hook

我正在尝试在CodeIgniter中设置'post_controller_constructor'挂钩。目的是检查用户是否未登录,然后将其重定向回登录页面。

这是我的钩子配置数组:

$hook['post_controller_constructor']  = array(
   'class'     => 'Checkpoint',
   'function'  => 'check_status',
   'filename'  => 'checkpoint.php',
   'filepath'  => 'controllers'
);

这是Hook事件的类

class Checkpoint {
var $CI;
function __construct(){
    $this->CI =& get_instance();
}
function check_status() {
    if($this->CI->router->class == 'Login'){
        return;
    } 
    if (!isset($this->CI->session)){
        $this->CI->load->library('session');
    } 
    if(!$this->CI->session->userdata('log_status')){
        //redirect(site_url('login'));
        echo "not logged in";
    }
    else{
        echo "logged in";
    }
}}

现在出现以下问题:

  1. 当它收到来自“登录”控制器的请求时,它不会从check_status()函数中的第一个if语句返回,并在加载视图之前打印“未登录”。

  2. 当我尝试重定向时,如果未设置会话userdata,则会在浏览器中显示错误“此网页有重定向循环”。出于这个原因,我已经注释掉了重定向语句

  3. 我该怎么做才能解决这些问题?

1 个答案:

答案 0 :(得分:3)

正如我在评论中所描述的那样,当您进入您的网站时,您的问题是钩子检查您是否已登录,如果不是,那么它会将您重定向到您的login页面再次触发挂钩,这将导致无限重定向过程。 这是一个可能的解决方案: 首先,在会话中指定user_data(一旦用户进入您的网站),表示该用户已在您的网站中,如:

$this->session->set_userdata('is_in_login_page', TRUE);

然后在你的钩子里你可以检查它:

if(!$this->CI->session->userdata('log_status') &&
 !$this->CI->session->userdata('is_in_login_page') ){
    redirect(site_url('login'));
    echo "not logged in";
}

因此,一旦重定向用户,'is_in_login_page'值将设置为TRUE,服务器将不再重定向他。

这可能听起来很愚蠢,但我认为这是一个很好的解决方案。

注意:当用户未登录并且他不在登录页面上时,is_in_login_page应设置为FALSE,以便服务器将其重定向到它。