2013-09-21 77 views
2

我想在CodeIgniter中设置'post_controller_constructor'挂钩。目的是检查用户是否未登录,然后将他重定向回登录页面。如何解决post_controller_constructor挂钩CodeIgniter中的重定向问题

这里是我的钩配置数组:

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

这是挂机事件类

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. 当它收到来自'Login'控制器的请求不会从check_status()函数中的第一个if语句返回,而在加载视图之前打印“未登录”。

  2. 当我尝试重定向,如果没有设置会话userdata,它会在浏览器中显示错误“此网页有重定向循环”。由于这个原因,我已经评论了重定向声明

我能做些什么来解决这些问题?

+0

我认为这只是你何时应该调用你的代码的问题。这取决于调用之前的代码。 –

+0

我正在构建任何控制器后调用此代码。我的目的是确保访问者无需登录即可访问任何网址。 – Rivnat

+0

那么这就没有意义了。因为一旦用户进入你的网站,他将没有会话,然后他将被重定向到登录页面,你的钩子会再次检查它,看看他还没有会话,另一个重定向将发生无限的时间。 –

回答

3

正如我在我的评论中描述的那样,您的问题是当您进入您的网站时,挂钩会检查您是否已登录,因此如果不是,那么它会将您重定向到您的页面,这也会触发挂钩再一次会导致无限的重定向过程。 这里是一个可能的解决方案: 首先,分配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当用户没有登录,他不在登录页面,因此服务器将他重定向到它。

+0

它最初的工作,第一次。当我第一次手动点击“base_url/welcome”时,它会重定向到登录页面。之后,当我尝试再次点击相同的网址时,欢迎页面出现。但是,我已按照您的指示解决了此问题。 – Rivnat

+0

很高兴我帮助:) –