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

Custom Error Message Does Not Display When Redirected If Session Expire

我正在使用 Codeigniter 版本 3.0.3 和 HMVC

开发我的登录控制器

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

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

When the session expires it redirects back to the admin page And should display message on login page. I am trying to set a $data variable message instead of using flash data

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

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

我还使用 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'
);

因为您从未设置该消息。您的会话已过期,您的 if 有两部分。

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

第二个条件:((isset($_GET['token']) && (isset($_SESSION['token']) && ($_GET['token'] != $_SESSION['token']))),即使在 $_GET 数组中设置了令牌,第二个条件也永远不会为真,因为您的会话已过期,并且令牌是未在会话中设置,and/or 与 $_GET 数组中的标记不同。