【问题标题】:PHP: Clicking back button still redirects to the previous pagePHP:单击后退按钮仍会重定向到上一页
【发布时间】:2019-02-21 15:07:51
【问题描述】:

PHP 真的很新。我有一个指向索引页面的登录页面。在索引页面上有一个注销按钮。因此,当我单击注销时,它将重定向到登录页面,并在我单击后退按钮时取消设置 $_SESSION。但它不会破坏会话。它仍然将我重定向到索引页面。但是已经有了未设置的值。似乎 session_destroy(); 不起作用。如果有人可以帮助我,那就太好了。谢谢!

这是我的 login.php

<?php 
 require('session.php'); 
?>

<html>
<head>
<!-- CSS -->
<link rel="stylesheet" href="css/style-login.css">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

</head>
<body>
    <div class="header">
        <img src = "img/usc_logo.png">  
    </div>
    <div class="box">
        <form id="loginform" class="form-horizontal" role="form" action = "" method = "POST">       
            <div style="margin-bottom: 25px" class="input-group">
                <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                    <input type="text" class="form-control" name="username" value="" placeholder="ID Number" required/>                                        
            </div>                 
            <div style="margin-bottom: 25px" class="input-group">
                <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
                    <input type="password" class="form-control" name="password" placeholder="Password" required>
            </div>
            <div style="margin-top:10px" class="form-group">
                                <!-- Button -->
                <div class="col-sm-12 controls">
                    <input class="submit-1" type = "submit" value = " Log in " name= "submit"/><br/><br/>
                    Not a member yet?
                    <a href="register.php" class="button">Register</a><br/><br/>
                        <center>
                        <span style='color:#e60000; font-size:15px;'><b><?php echo $error; ?></b></span>
                        </center>
                </div>
            </div>     
        </form>
    </div>

    <!-- JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>

这是我的 index-admin.php

 <?php 
 require('session.php'); 
 ?>

<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
    <meta name="generator" content="Jekyll v3.8.5">
    <title>Admin DCIS</title>

    <link rel="canonical" href="https://getbootstrap.com/docs/4.3/examples/album/">

    <!-- Bootstrap core CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">


     <style>
      .bd-placeholder-img {
        font-size: 1.125rem;
        text-anchor: middle;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
      }

      @media (min-width: 768px) {
        .bd-placeholder-img-lg {
          font-size: 3.5rem;
        }
      }
    </style>
    <!-- Custom styles for this template -->
    <link href="album.css" rel="stylesheet">
  </head>
  <body>
    <header>
  <div class="collapse bg-dark" id="navbarHeader">
    <div class="container">

    </div>
  </div>
  <div class="navbar navbar-dark bg-dark shadow-sm">
    <div class="container d-flex justify-content-between">
      <a href="#" class="navbar-brand d-flex align-items-center">   
        <strong>Hello, <?php echo $_SESSION['user_role'] ?></strong>
      </a>
      <a href="logout.php" class="btn btn-danger">Logout</a>    
    </div>
  </div>
</header>

<main role="main">

   <section class="jumbotron text-center">
    <div class="container">
      <h1 class="jumbotron-heading">Name of Requestee</h1>

        <button href="#" class="btn btn-primary my-2">Accept</button>
        <button href="#" class="btn btn-secondary my-2">Reject</button>
      </p>
    </div>
  </section>


<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>

这是logout.php

<?php
session_start();
session_unset();
session_destroy();
header('Location: login.php');
?>

如果需要,这是我的 session.php

    <?php
require("dbconnector.php");
    $error="";
    session_start();
    if(isset($_POST['submit'])){    
        require ('dbconnector.php');    
        $query = "SELECT * FROM user WHERE username = '{$_POST['username']}' AND password = '{$_POST['password']}'";
        $con = mysqli_query($conn, $query);
        if ($con->num_rows == 1){
            $row = mysqli_fetch_assoc($con);
            $_SESSION['user_role'] = $row['user_role'];

            mysqli_close($conn);
            if ($_SESSION['user_role'] == 'Admin'){
                header('Location: index-admin.php');
             }
            elseif($_SESSION['user_role'] == 'Student') {
                header('Location: index.php');
            }
        }   
        else{
            $error = "ID Number or Password is Invalid";
            header("refresh: 5");
        }
     }
?>

【问题讨论】:

  • 分享代码,你会看到奇迹发生!
  • 如果您愿意,可以手动清除 $_SESSION ($_SESSION = [];)。但这不是解决问题的最佳方法。
  • 发布您的代码。让我们看看有什么问题。
  • 我已经编辑了帖子并发布了我的代码

标签: php session logout


【解决方案1】:

您需要在客户端正确销毁会话和会话的 cookie。我建议不要在登录页面上写这个,而是在一个特定的页面上,比如 logout.php,它会重定向到 login.html。

<?php 
    session_start(); // Start by calling the session.
    $_SESSION = array(); // Reset the session's variables.
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]); //Invalids session's cookie.
    session_destroy(); //Finally destroy it.
    //If you want to redirect
    header("Location: <URL>");
?>

【讨论】:

  • 不起作用,先生。它取消了会话,但是当点击后退按钮时,它仍然会重定向到 index-admin.php 页面
  • 你应该发布你的代码来帮助我们调试,但这是一个重定向问题,对吧?您不能只更改 html 或 js 中的链接,但是您这样做了?我建议您的按钮重定向到 logout.php 并从那里重定向到 login.php
  • 是的。我更新了它。我的错。但是嗯,我的 login.php 重定向到 index-admin.php。因此,当我从那里注销时,我将被定向到 login.php。但是如果我单击后退按钮,它会将我带到 index-admin.php。我真的不希望这种情况发生。还有其他方法吗?因为似乎 session_destroy();不管用。感谢您的帮助!
  • 这是一个奇怪的模式。我会做类似 loginpage.html(表单)-> login.php(检查凭据并重定向到正确的索引)-> index.php 或 index-admin.php(当用户单击注销按钮时)-> logout.php(删除 cookie 和变量)-> loginpage.html。 $_POST['submit'] 也有点奇怪。您应该检查是否同时设置了 $_POST['username'] 和 $_POST['password']。
  • 请添加条件来检查会话 if ($_SESSION['user_role'] != 'Admin') { redirect(); }.. 在经过身份验证的用户的每一页上。没有一个 login.php。您只能在 login.php 上设置会话。但需要单独检查。
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2012-11-14
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多