我正在尝试在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";
}
}}
现在出现以下问题:
当它收到来自“登录”控制器的请求时,它不会从check_status()函数中的第一个if语句返回,并在加载视图之前打印“未登录”。
当我尝试重定向时,如果未设置会话userdata,则会在浏览器中显示错误“此网页有重定向循环”。出于这个原因,我已经注释掉了重定向语句
我该怎么做才能解决这些问题?
答案 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
,以便服务器将其重定向到它。