如果会话过期,重定向时不会显示自定义错误消息

时间:2015-11-20 03:37:39

标签: codeigniter codeigniter-3 codeigniter-hmvc

我使用 Codeigniter版本3.0.3和HMVC

在我的登录控制器上工作

当用户登录管理仪表板时,它会设置会话令牌,然后将其重定向到URL

http://localhost/projectname/admin/common/dashboard/?token=bf9691a625fbd0c3513ad822b0f76c6efb45e9b535c7b732d1ff006ce17f8734
  

当会话过期时,它会重定向回管理页面并且应该在登录页面上显示消息。我是   尝试设置 $ data variable 消息而不是使用Flash数据

由于某种原因,当会话过期并被重定向回管理员时,警告消息不会激活。

问题:为什么会话过期后自定义数据消息会在重定向回管理员登录后不显示?

我还使用codeigniter钩子函数来运行登录检查功能

控制器

文件名:Login.php

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Login extends MX_Controller {

    private $error = array();

    public function index() {
        $data['title'] = 'Administration';

        $data['heading_title'] = 'Administration';

        if (($this->input->server('REQUEST_METHOD') == 'POST') && $this->validate()) {

            $this->load->library('encryption');

            $token =  bin2hex($this->encryption->create_key(32));

            $this->session->set_userdata(array('token' => $token));

            redirect('admin/common/dashboard/?token=' . $token);
        }

        // Message Below Not Display On Login If Session Expire And Has Been Redirected Back To Admin
        if ((isset($_SESSION['token']) && !isset($_GET['token'])) || ((isset($_GET['token']) && (isset($_SESSION['token']) && ($_GET['token'] != $_SESSION['token']))))) {
            $this->error['warning'] = 'Your Session Token Is Invalid!';
        }

        if (isset($this->error['warning'])) {
            $data['error_warning'] = $this->error['warning'];
        } else {
            $data['error_warning'] = '';
        }

        $data['header'] = Modules::run('admin/common/header/index', $data);
        $data['footer'] = Modules::run('admin/common/footer/index');

        $this->load->view('common/login', $data);

    }


    protected function validate() {
        if (!isset($_POST['username']) || !isset($_POST['password']) || !$this->user->login($_POST['username'], html_entity_decode($_POST['password'], ENT_QUOTES, 'UTF-8'))) {
            $this->error['warning'] = 'Incorrect Username Or Password!';
        }

        return !$this->error;
    }

    public function check() {
        $uri_route = $this->uri->segment(2) .'/'. $this->uri->segment(3);

        $route = isset($uri_route) ? $uri_route : '';

        $ignore = array(
            'common/login',
            'common/forgotten',
            'common/reset'
        );

        if (!$this->user->is_logged() && !in_array($route, $ignore)) {
            redirect('admin/common/login');
        }

        if (isset($route)) {
            $ignore = array(
                'common/login',
                'common/logout',
                'common/forgotten',
                'common/reset',
                'error/not_found',
                'error/permission'
            );

            if (!in_array($route, $ignore) && (!isset($_GET['token']) || !isset($_SESSION['token']) || ($_GET['token'] != $_SESSION['token']))) {
                redirect('admin/common/login');
            }

        } else {

            if (!isset($_GET['token']) || !isset($_SESSION['token']) || ($_GET['token'] != $_SESSION['token'])) {
                redirect('admin/common/login');
            }
        }
    }
}

登录查看$ error_warning

<?php if ($error_warning) { ?>
<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?php echo $error_warning; ?>
<button type="button" class="close" data-dismiss="alert">&times;</button>
</div>
<?php } ?>

挂钩

<?php

$hook['pre_controller'] = array(
        'class'    => 'Login',
        'function' => 'check',
        'filename' => 'Login.php',
        'filepath' => 'modules/admin/controllers/common'
);

1 个答案:

答案 0 :(得分:1)

因为你从未设置过这个消息。您的会话已过期,而您的会话已分为两部分。

第一部分:(isset($_SESSION['token']) && !isset($_GET['token'])):会话已过期,令牌未在会话中设置,因此第一个条件为false。

第二个强大的条件:((isset($_GET['token']) && (isset($_SESSION['token']) && ($_GET['token'] != $_SESSION['token']))),即使在$_GET数组中设置了第二个条件永远不会为真的标记,因为你的会话已经过期,并且没有设置标记在会话中,和/或与$_GET数组中的令牌不同。