Codeigniter 按下注销按钮并禁用后退浏览器按钮

Posted

技术标签:

【中文标题】Codeigniter 按下注销按钮并禁用后退浏览器按钮【英文标题】:Codeigniter pressing logout button and disable the back browser button 【发布时间】:2017-01-18 11:13:48 【问题描述】:

大家好,我正在使用 CodeIgniter 框架,我在注销后出现问题,会话已被破坏并重定向到登录表单,并且在重定向到登录表单后,浏览器后退按钮可以返回到仪表板但有错误因为会话已经被破坏了。我想要的只是禁用浏览器的后退按钮或我以前无法加载的任何内容。我已阅读有关此问题的其他帖子并尝试了他们的解决方案,但它不起作用。我已经根据我在构造函数的其他帖子中阅读的内容粘贴了此代码。

The code that I've seen from the post and posted in my constructor :
 header("cache-Control: no-store, no-cache, must-revalidate");
        header("cache-Control: post-check=0, pre-check=0", false);
        // HTTP/1.0
        header("Pragma: no-cache");
        // Date in the past
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        // always modified
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 

这是我的注销:

 $sess_array = array(
        'username' => ''
        );
        $this->session->unset_userdata('logged_in', $sess_array);
        $this->session->sess_destroy();
        redirect('auth', 'refresh');

这是来自我的仪表板:

    <li>                                 
<a href="<?= base_url('auth/logout') ?>"><i3 class="glyphicon glyphicon-off"></i3> Logout</a>
   </li>

【问题讨论】:

【参考方案1】:

我厌倦了实施此选项,但效果不佳。所以我对此实现了新的逻辑。

只需检查每个主要方法中是否设置了会话。下面的代码可以帮助你

注销时(在控制器中定义)

function __construct()

    parent::__construct();
    ob_start(); # add this


public function logout()

    $this->load->driver('cache');
    $this->session->sess_destroy();
    $this->cache->clean();
    ob_clean();
    redirect('home'); # Login form or some other page         

在仪表板中(功能)

public function home()

    $logged_in = $this->session->userdata('logged_in');
    if($logged_in != TRUE || empty($logged_in))
    
        #user not logged in
        $this->session->set_flashdata('error', 'Session has Expired');
        redirect('user_logging'); # Login view
    
    else
    
        #user Logged in
        $this->load->view("viewname",$data);
    

在登录(函数)中

$session = array(
    'username'  => $name,
    'logged_in' => TRUE
);

$this->session->set_userdata($session);

【讨论】:

您好先生,我该如何操作此代码 $this->session->set_userdata('logged_in', $session_data);满足关于logged_in = TRUE的if条件 你的会话字段是什么?? $session_data = array ('user_email' => $res[0]->user_email, 'user_id' => $res[0]->user_id, 'usertype_name' => $res[0 ]->usertype_name, 'user_fname' => $res[0]->user_fname, 'user_mname' => $res[0]->user_mname, 'user_lname' => $res[0]->user_lname ); $this->session->set_userdata('logged_in', $session_data); @AbdullaNilam 您能解释一下为什么要加载缓存驱动程序吗?好奇 @Alex 满足这个 Jc John 的要求。当我检查他的代码时,他被使用了缓存。现在清楚了吗?【参考方案2】:

您正在尝试解决错误的问题:如果注销后返回导致页面充满错误,则直接进入该页面会导致同样的问题。

这绝不应该发生,而是当有人试图打开一个在未登录时不应打开的页面时,访问者应该被引导到登录页面。

除此之外,您不应扰乱用户的浏览器体验。所以即使你可以,你也不应该禁用后退按钮。即使可以,也可以通过禁用 javascript(例如...)轻松规避它。

【讨论】:

谢谢您的回答先生。我的代码运行良好,它在注销后提供错误,因为会话已经被破坏。先生,我该如何解决?【参考方案3】:

首先,在您成功登录到管理面板时设置用户数据会话值,在您从登录完成所有验证后使用此行

$this->session->set_userdata('admin_id',$admin_id);

你可以做一件事来避免用户面板或管理面板页面的蚂蚁直接登录,只需像这样在你的管理控制器中创建一个构造函数

public function __construct()

    parent::__construct();
    if(! $this->session->userdata('admin_id'))
        return redirect('login_controller');//your login controller which have login page as view in index function//
    
 

并像这样使用注销功能:

public function logout()

    $this->session->unset_userdata('admin_id');
    return redirect('login_controller');

通过这种方式,在您从管理面板注销并尝试使用后退按钮或尝试使用任何管理面板页面或无法打开的功能的直接调用后,它对我有用并且仍在使用此代码在用户和管理面板制作中

【讨论】:

【参考方案4】:

希望对您有所帮助

您的登录功能

function login() 

     $query = $this->login_model->get_user($username, $password);

     foreach ($query as $row) 
          $username = $row->username;
     

     $session_array = array(
          'username' => $username,
          'logged_in' => TRUE
     );

     $this->session->set_userdata('logged_in', $session_array);

您的注销功能

public function logout() 

    $this->session->unset_userdata('logged_in');
    $this->session->sess_destroy();
    redirect('login', 'refresh');

在仪表板或家庭控制器中

function index() 

    if ($this->session->userdata('logged_in') !== FALSE && ($this->session->userdata['logged_in']['login_type'] == "" ))
    
         // Your codes 
     else 
       redirect('login/logout');
    

【讨论】:

【参考方案5】:
you can use the construct method at the beginning of your admin controller, inside construct add the condition it will work in every function as long as the controller is admin,

public function __construct()

    parent::__construct();
    if(! $this->session->userdata('admin_id'))
        return redirect('login_controller');//your login controller which have login page as view in index function//
    
 


but as you move on deep into your web application and browse through several controllers and methods, you will encounter "page not found page" if you log out somewhere in the middle of the page with a controller other than admin,

To solve this problem add the construct method like below code in all the controllers construct at the beginning and then you will be able to logout from anywhere with session destroy,



public function __construct()

    parent::__construct();
    if(! $this->session->userdata('admin_id'))
        return redirect('login_controller');//your login controller which have login page as view in index function//
    
 

【讨论】:

以上是关于Codeigniter 按下注销按钮并禁用后退浏览器按钮的主要内容,如果未能解决你的问题,请参考以下文章

servlet会话,注销后,按下浏览器的后退按钮时,再次显示安全页面[重复]

当在rails中按下浏览器的后退按钮时,在注销后进入登录页面

如果会话无效,请禁用浏览器后退按钮 [重复]

在jsp中注销时禁用后退按钮[重复]

使用jquery在浏览器中禁用后退按钮?

为啥在c#,mvc中退出并按下浏览器后退按钮时会转到一个页面