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

时间:2016-09-10 12:43:27

标签: php codeigniter session

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

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>

5 个答案:

答案 0 :(得分:5)

我厌倦了实施这个选项,但它不能很好地运行。所以我在这上面实现了新的逻辑。

  

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

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

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);

答案 1 :(得分:2)

您正在尝试解决错误的问题:如果在注销后返回会导致页面出现错误,直接转到该页面会导致同样的问题。

这应该永远不会发生,相反,当有人试图打开不登录时不应打开的页面时,应将访问者定向到登录页面。

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

答案 2 :(得分:1)

首先,在您成功登录管理面板后设置userdata会话值在您从

登录完成所有验证后使用此行

$这 - &GT;会话而&GT; set_userdata(&#39; admin_id&#39;,$ admin_id);

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

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');
}

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

答案 3 :(得分:1)

希望这对您有帮助

您的登录功能

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');
    }
}

答案 4 :(得分:0)

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//
    }
}