我基本上是在尝试会话控制。如果用户已登录,则可以继续。但如果他没有登录,那么它将显示登录屏幕然后死亡。但是,当我在构造函数中使用die
或exit
时,它不会显示登录屏幕;它会立即死亡。代码如下:
private $username = null;
private $mongoid = null;
private $neoid = null;
public function __construct(){
parent::__construct();
// session to global
$this->username = $this->session->userdata( 'username');
$this->mongoid = $this->session->userdata( 'mongoid');
$this->neoid = $this->session->userdata( 'neoid');
// check if user is logged in
if( $this->username == "" || empty( $this->username)){
$this->load->view( 'access/login');
die;
}
}
如果die
未写入die
,则显示登录页面,但die
未显示。为什么我要使用{{1}}?因为如果我不使用它,它会移动索引函数,如果用户没有登录,我不希望它执行索引函数。
这里有什么问题?我该怎么用来停止执行?
答案 0 :(得分:1)
当您使用$this->load->view();
加载视图时,CodeIgniter不会立即输出视图,而是将视图的输出放入输出缓冲区,并且在加载所有内容后,它会将整个输出刷新到用户。话虽如此,你看到的问题是它缓冲了输出,然后它就会在没有刷新的情况下死掉。
die
非常糟糕,不应该在调试之外使用,你应该更好地使用像变量开关这样的东西。如果它仅适用于控制器范围,那么您可以制作
private $show_everything_else = true;
在构造函数中:
if( $this->username == "" || empty( $this->username)){
$this->load->view( 'access/login');
$this->show_everything_else = false;
}
在任何控制器的方法中:
if($this->show_everything_else) {
// ...
}
无论如何,这个解决方案是一个快速解决方案,如何做到这一点有更好的可能性,但所有这些都需要不同的方法。
答案 1 :(得分:1)
Controller类将自动运行index()函数。因此,要使其正常工作,如果登录签入构造失败,则必须返回index()。您可以在这里做什么:
private $username = null;
private $mongoid = null;
private $neoid = null;
private $no_login = false;
public function __construct(){
parent::__construct();
// session to global
$this->username = $this->session->userdata( 'username');
$this->mongoid = $this->session->userdata( 'mongoid');
$this->neoid = $this->session->userdata( 'neoid');
// check if user is logged in
if( $this->username == "" || empty( $this->username)){
$this->load->view( 'access/login');
$this->no_login = true;
}
}
function index(){
if($this->no_login) return;
// another statement if login success.....
}
答案 2 :(得分:0)
你可以有一个方法并在构造函数中调用它:
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) {
redirect('login');
die();
}
}
当然,你应该有登录控制器,它可以是这样的:
<?php
class Login extends CI_Controller {
function index() {
$this->load->view('LOGIN-VIEW');
}
function validate() {
$this->load->model('login_model');
$data = $this->login_model->validate();
if ($data != false) {
$data['is_logged_in'] = true;
$this->session->set_userdata($data);
redirect('MAIN-CONTROLLER-AFTER-LOGIN');
}
else {
$this->index();
}
}
function logout() {
$this->session->sess_destroy();
$this->index();
}
}
我发布的内容,也保留了数据库中的会话。
登录模型可以像这样原始:
类Login_model扩展了CI_Model {
function validate() {
$this->db->where('username', $this->input->post('username'));
$this->db->where('password', md5($this->input->post('password')));
$query = $this->db->get('users');
if($query->num_rows == 1) {
$data = $query->row_array();
return $data;
} else {
return false;
}
}