【问题标题】:Custom Error Message Does Not Display When Redirected If Session Expire如果会话过期,重定向时不显示自定义错误消息
【发布时间】:2015-11-20 03:37:39
【问题描述】:

我正在使用 Codeigniter 版本 3.0.3 和 HMVC

开发我的登录控制器

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

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

当会话到期时,它会重定向回管理页面,并且应该在登录页面上显示消息。我是 尝试设置 $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'
);

【问题讨论】:

    标签: codeigniter codeigniter-3 codeigniter-hmvc


    【解决方案1】:

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

    第一部分:(isset($_SESSION['token']) &amp;&amp; !isset($_GET['token'])):会话已过期,会话中没有设置token,所以第一个条件为假。

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

    【讨论】:

    • @wolfgang1983 好吧,据我了解你的代码,如果你的会话令牌没有在$_SESSION$_GET 中设置,只需检查这两个是否都设置,如果没有,错误.如果两者都设置了,请检查它们是否相同(如果您需要该逻辑)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2023-03-06
    • 1970-01-01
    • 2012-05-28
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多