代码点火器中的注销问题(PHP)

时间:2012-10-26 18:33:33

标签: php codeigniter

我将loginuserid存储在会话中并在注销时销毁会话。登录和注销工作正常,但我的问题是当用户注销时,我们按下后退按钮它仍然能够打开访问过的页面,甚至当他被执行时。

用户在刷新页面时转到登录页面。我希望用户即使按下后退按钮也不会去访问过的页面。请帮帮我。在此先感谢。

3 个答案:

答案 0 :(得分:3)

这实际上是因为浏览器缓存 - 如果需要任何缓存,您应该禁用它并使用CodeIgniters Cache Library

将以下内容添加到需要登录用户的页面中:

//Prevent browsers from using history to browse in the user system.
$this->CI->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->CI->output->set_header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
$this->CI->output->set_header("Pragma: no-cache"); 

在浏览器中按回时,页面将被刷新,

答案 1 :(得分:2)

页面显示的原因是浏览器从缓存中引入它。要指示浏览器不应该从缓存中显示您的网页,您可以在应用的每个安全页面的no-cache内添加<head>元标记:

<meta http-equiv="Cache-Control" content="no-cache" />

如果您不想避免缓存,另一种选择(有点复杂)是让javascript向服务器发出AJAX调用,检查用户是否每次打开安全页面时都已登录。像这样:

$.getJSON('/user_logged_in.php', function(loggedIn) {
    if(!loggedIn)
        window.location.href = '/login.php';
});

user_logged_in.php脚本应返回TRUE或FALSE。

希望这有帮助。

答案 2 :(得分:0)

有两个问题:

第一个问题是,即使您正在清除会话,该页面也会被存储的缓存访问。

因此您必须清除缓存或不保存缓存。 就在你的__construct函数中的代码下面。

$this->output->set_header('Last-Modified:'.gmdate('D, d M Y H:i:s').'GMT');
$this->output->set_header('Cache-Control: no-store, no-cache, must-revalidate');
$this->output->set_header('Cache-Control: post-check=0, pre-check=0',false);
$this->output->set_header('Pragma: no-cache');

执行此步骤后即使您要转到上一页,您在登录后重定向,那么

如果用户已登录,您可以查看该经过身份验证的页面。如果他未登录,则不会删除该页面。

示例:

public function after_log_in()
{
   if(!empty($SESSION['username'] && $SESSION['os_logged_in'] == true))
   {
      $this->load->view('clienview');
   }
   else
   {
      echo "You are not logged in!";
   }
}

因此,在您退出后按后退按钮时,它将检查用户是否已登录。如果您尚未登录,则会向您显示错误。