9

我遇到了麻烦session_destroy()

当用户按下注销时,它必须销毁会话。我写了以下代码:

注销.php

<?php
    session_start();
    session_destroy();
    header("location: LoginViewController.php");
?>

按下注销后,当我按下浏览器后退按钮时,它会在Login.php页面中显示我以前的登录用户页面和会话用户名

登录.php

<?php
    session_start();
    $_SESSION['user']=  $_GET['username'];
    echo '"<div style="background:white; text-align:right"> Login as:'.$_SESSION['user'].'</div>"';
    echo '<a href="Logout.php" style="text-align:right">Logout</a>';

登录视图控制器.php

<?php
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

    $Username = $_POST['uname'];
    $Password = $_POST['pwd'];
    $User_Type=$_POST['type'];

    If (!(empty($Username) && empty($Password) && empty($User_Type))){
        $model = new UsersModel();
        $rowsCount = $model->checkUser($Username,$Password,$User_Type);

        if ($rowsCount!=0){
            header("location:login.php?username=".$_POST['uname']."");  
        } else {
            echo '<script type="text/javascript">alert("Enter username and password correctly");
            window.location.href="LoginViewController.php";</script>';
        }
    }

我不知道为什么它会这样工作。

请帮助我找出我犯错的地方。

我想在注销后禁用该浏览器后退按钮。

4

7 回答 7

8

login.php 页面:

<?php 
    if (isset($_POST['uname'], $_POST['pwd'], $_POST['type'])) {
        $Username = $_POST['uname'];
        $Password = $_POST['pwd'];
        $User_Type=$_POST['type'];
        if (!(empty($Username) || empty($Password) || empty($User_Type))) 
        {
             $model = new UsersModel();
             $rowsCount = $model->checkUser($Username,$Password,$User_Type);
             if ($rowsCount!=0)
             {
                  $_SESSION['user'] = $Username;
                  header("Location:LoginViewController.php");

             } else {
                  echo 'Bad user';
             }
        } else {
             echo 'Please, fill all inputs';
        }
    } else {
        echo 'Bad form sent';
    }
?>
<form name="f1" method="POST" action="" >
    // inputs
</form>

登录视图控制器.php:

<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

if (!isset($_SESSION['user'])) {
    header('Location: login.php');
    exit();
}
echo 'You have successfully logged as '.$_SESSION['user']
?>

并添加标题以强制浏览器重新验证页面:

注销.php:

<?php 
session_start();
session_destroy();
$_SESSION = array();
header("location: login.php");
?>
于 2013-06-06T12:30:32.963 回答
4

这是由在页面中保留详细信息的浏览器缓存引起的,如果您刷新页面或在您的私人区域中进一步移动,您将被提示登录页面并且您将无法看到任何内容,假设您的登录检查系统是否正确配置。

否则,您可以强制浏览器不缓存页面,并向服务器发出新请求以获取该页面

header("Cache-Control: private, must-revalidate, max-age=0");
header("Pragma: no-cache");
header("Expires: Fri, 4 Jun 2010 12:00:00 GMT");
于 2013-06-06T11:44:02.660 回答
2

您应该从注销脚本进行重定向。

例如:

header("Location: index.php");

如果用户下次回击,它将再次进入 logout.php 页面,您可以在其中再次检查并再次重定向:) 如果用户再次尝试,这是一个无限循环。

于 2013-06-06T11:43:40.207 回答
1

这是我的 LoginController.php

  <?php

     header("Cache-Control: private, must-revalidate, max-age=0");
     header("Pragma: no-cache");
     header("Expires: Fri, 4 Jun 2010 12:00:00 GMT");

//如果您正在提交表单,则将详细信息插入数据库

   $Username = $_POST['uname'];
    $Password = $_POST['pwd'];
    $User_Type=$_POST['type'];
    session_start();

   If (!(empty($Username) && empty($Password) && empty($User_Type))) 
   {

    $model = new UsersModel();

    $rowsCount = $model->checkUser($Username,$Password,$User_Type);

    if ($rowsCount!=0)
    {
        $_SESSION['user'] = $Username;
       header("location:login.php");

    } else 
        {
        echo '<script type="text/javascript">alert("Enter username and password correctly");
        window.location.href="LoginViewController.php";</script>';
           }
        }

    }
     ?>

这是我的登录页面(login.php).. 并显示会话用户名和注销链接

    <?php

      header("Cache-Control: private, must-revalidate, max-age=0");
      header("Pragma: no-cache");
      header("Expires: Fri, 4 Jun 2010 12:00:00 GMT");

      session_start();
     if(!isset($_SESSION['user']))
     {
       header('Location: LoginViewController.php');
        exit();
       }
      echo '"<div style="background:white; text-align:right"> Login as:'.$_SESSION['user'].'
       <a href="Logout.php" style="text-align:right">Logout</a></div>"';
        ?>

这是我的 Logout.php

   <?php
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
     session_start();
      session_destroy();
      header("Location: LoginViewController.php");
   ?>
于 2013-06-11T05:39:33.103 回答
0
if (window.history) {
window.history.forward(1);
}
于 2013-06-06T11:53:03.137 回答
0
header("Cache-Control: private, must-revalidate, max-age=0");
header("Pragma: no-cache");
header("Expires: Fri, 4 Jun 2010 12:00:00 GMT");
于 2013-06-06T12:41:31.127 回答
0

在除登录页面和登录验证页面之外的所有页面上尝试此代码。

session_start();

if (!$_SESSION['sesuname']) {
    echo "You are not logged in.";
    exit();
} else {    
    /* All other codes must be here */
}
于 2015-09-16T06:14:40.850 回答