PHP实现登出后点击浏览器返回按钮跳转至登录页
解决登出后返回按钮跳转问题的方案
我来帮你搞定这个问题!你遇到的情况是因为浏览器缓存了samp2.php的页面,登出后点击返回时,浏览器直接加载本地缓存的页面,而不是重新向服务器请求。同时原代码里samp2.php没有先检查会话是否有效就直接使用$_SESSION['session_var_user'],所以会触发未定义索引的报错。
下面是具体的修改方案:
1. 修改samp2.php,添加会话检查与缓存控制
把samp2.php的代码改成这样:
<?php session_start(); // 检查用户是否已登录,未登录则直接跳转到登录页 if(!isset($_SESSION['session_var_user'])){ header("Location: samp.php"); exit(); // 确保后续代码不再执行 } // 设置响应头,禁止浏览器缓存当前页面 header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1 header("Pragma: no-cache"); // HTTP 1.0 header("Expires: 0"); // 过期时间设为过去,强制浏览器不缓存 echo "Hi," . $_SESSION['session_var_user']; if(isset($_POST['logout'])) { // 清空会话变量 $_SESSION = array(); // 销毁会话 session_destroy(); // 跳转到登录页 header('Location: samp.php'); exit(); } ?> <form action = "samp2.php" method="post"> <input type="submit" name="logout" value="logout"> </form>
关键修改点说明:
- 会话检查:在页面最开始就判断
$_SESSION['session_var_user']是否存在,如果不存在直接跳转到登录页,这样就算浏览器返回加载页面,服务器也会强制跳转,不会出现报错。 - 缓存控制头:这三个头会告诉浏览器不要缓存当前页面,下次返回时必须重新向服务器请求,这样服务器就能执行会话检查的逻辑,而不是加载缓存的旧页面。
- 登出逻辑优化:登出时先清空
$_SESSION数组,再销毁会话,确保当前请求里的会话变量也被清除,避免后续代码意外使用旧值。
2. 额外建议:修复SQL注入风险
顺便提一句,你当前samp.php里的SQL查询存在严重的SQL注入风险,直接把用户输入的$username和$password拼进SQL语句里,很容易被攻击。建议改成预处理语句:
修改samp.php里的查询部分:
// 替换原来的查询代码 $stmt = $conn->prepare("SELECT * FROM tbl_name WHERE col_userName = ? AND col_custPass = ?"); $stmt->bind_param("ss", $username, $password); $stmt->execute(); $result = $stmt->get_result(); if(mysqli_num_rows($result)==1) { $_SESSION['session_var_user'] = $username; header('Location:samp2.php'); exit(); } else { echo "Username or password mismatch"; }
这样能有效防止SQL注入,让你的代码更安全。
内容的提问来源于stack exchange,提问作者mgunner
相关产品推荐
相关产品推荐

