3

我将 loginuserid 存储在会话中并在注销时销毁会话。登录和注销工作正常,但我的问题是当用户注销并且我们按下后退按钮时,它仍然能够打开访问过的页面,即使他实际上已经注销。

当我们刷新页面时,用户进入登录页面。我希望用户即使按下后退按钮也不要访问访问过的页面。请帮帮我。提前致谢 。

4

3 回答 3

3

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

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

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

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

于 2012-10-26T18:43:03.130 回答
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。

希望这可以帮助。

于 2012-10-26T18:52:09.937 回答
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!";
   }
}

因此,注销后,当您按下返回按钮时,它将检查用户是否已登录。如果您没有登录,它将向您显示错误。

于 2016-04-03T22:30:20.147 回答