我添加了一个会话&使用此代码防止用户在注销后访问页面,但我不能这样做。用户仍然可以访问上一页。下面是代码
登录码为
<form id="form1" name="form1" method="post" action="alogin.php" onsubmit="return(validate());">
<p align="center"><font style="Arial" size="+1" color="#000000">Username :
<label for="name"></label>
<input type="text" name="name" id="name" />
</p>
<br />
<br />
<p align="center">Password :
<label for="pass"></label>
<input type="password" name="pass" id="pass" /></font>
</p>
<p align="center">
<br />
<br />
<input type="submit" name="submit" id="submit" value="Login" />
</p>
</form>
在每个受保护的页面中我都使用这个
<?php
session_start();
if (!isset($_SESSION['name'])) {
header("location:login.html");
} else {
}
?>
而logout.php包含
<?php
session_start();
$_SESSION=array();
setcookie(session_name(),"",time()-3600);
session_destroy();
header("Location: login.html?id=You are successfully logged out");
?>
当用户向浏览器发出"back"时,浏览器可以决定从缓存中加载页面。用户将无法做已登录用户可以做的事情,因为会话已被销毁并且无效。
一个可能的解决方法是在那些敏感的页面上包含一个ajax请求,检查用户是否仍在登录。如果是,则显示敏感元素(或通过ajax获取),如果不是(用户已注销),则显示警告或将其转发到登录页面(通过js)。
这就是所谓的缓存。因此,没有向服务器发出请求。
在header("location:login.html");
之后您可能还想执行die();
以防止登录的html也被输出
请注意 :这只是一个"暗示性"的答案。
这是我使用的,效果很好。
在您的表单中,必须具有.php
文件扩展名,使用以下内容:
session_start();
$firstname = $_SESSION['unique_session_name'];
// yours being $name
// some code
$firstname = $_POST['firstname'];
然后,在受保护的页面中:
session_start();
$_SESSION["unique_session_name"] = $_POST["firstname"];
if (isset($_SESSION['unique_session_name'])) {
// some code
}
按照您提到的逻辑,似乎是您如何检查会话的问题。如果您在受保护的页面上执行session_start();,然后检查会话,则不起作用。
尝试检查会话
if(session_id() == '') {
// session isn't started
session_start();
}
else
{
header("location:login.html");
}
这有点像在黑暗中摸索,因为其他人已经提到了缓存问题。不久前我有一个类似的问题,我相信我通过手动取消设置我正在检查的会话变量来解决它。我不确定这是否会有帮助,但它似乎对我有用。
session_unset();
unset($_SESSION['name']);
这是一个尝试一切可能的情况。
创建了一个名为session.php的文件
<?php
ob_start();
session_start();
// just call this file session.php and share it in all your file, which you want to protect with session,
?>
我们需要将文件包含在我们想要保护的每个页面中,就像这样
<?php
include 'session.php';
var_dump($_SESSION);
if(isset($_SESSION) ){
if(!$_SESSION['name']=='admin'){
header("Location:login.html?id=access_forbidde");
}
}else{
header("Location:viewall.php?id=access_forbidde");
}
在else中,您必须在该特定页面中分别命名每个页面。
,注销包含
<?php
include 'session.php';
$_SESSION=array();
setcookie(session_name(),"",time()-3600);
session_destroy();
header("Location: login.html?id=logout_successful");
?>
感谢PHP_Noob的帮助。,
我创建了一个名为" session-cookie "的cookie,并在用户成功登录时将其值设置为true。
当用户注销时,我将'session-cookie'设置为空。
然后在Javascript中添加以下内容,
<script>
if( document.cookie.indexOf("session-cookie") < 0 ) {
location.replace('http://[any url]/');
}
</script>
他们可以点击后退键查看缓存的页面,但它会迅速重定向并覆盖历史记录中的当前页面。