当用户离开特定页面时,我需要销毁会话。我在页面的末尾使用了session_destroy()
,但这对我来说不可行,因为我的页面已经分页了。我的页面是:abc.php?page=1
或abc.php?page=2
或abc.php?page=3
。
因此,当用户离开abc.php
页面时,我需要销毁一个会话。如果不使用cookie,我怎么能这样做?
答案 0 :(得分:19)
当用户导航离开页面时做某事是错误的方法,因为你不知道用户是否会导航到一个完整的不同页面(比如说参数的contact.php)或者他/她将转到abc.php的下一页,正如Borealid指出的那样,如果没有JS,你就无法做到。相反,您只需添加一个检查,然后查看用户是否来自abc.php :
首先,在您的abc.php文件中,在$ _SESSION数组中设置一个唯一变量,该变量将充当用户在此页面上的标记:
$_SESSION['previous'] = basename($_SERVER['PHP_SELF']);
然后,在任何输出之前在所有页面上添加此项以检查用户是否来自abc.php:
if (isset($_SESSION['previous'])) {
if (basename($_SERVER['PHP_SELF']) != $_SESSION['previous']) {
session_destroy();
### or alternatively, you can use this for specific variables:
### unset($_SESSION['varname']);
}
}
这样,只有当用户来自abc.php 并且当前页面是另一个页面时,您才会销毁会话(或特定变量)。
我希望我能够清楚地解释这一点。
答案 1 :(得分:4)
要在用户实际离开页面时触发,您必须使用Javascript将异步请求发送回服务器。服务器无法神奇地知道用户已经“离开”了一个页面。
请参阅http://hideit.siteexperts.com/forums/viewConverse.asp?d_id=20684&Sort=0。
答案 2 :(得分:1)
我有一个类似的问题,但我的页面重新加载我想要打印的变量被销毁。这是我的网页设计课程的登录,如果用户输入了错误的用户名或密码,我正在进行错误反馈。我可以显示错误但如果我点击刷新页面,他们的错误就会停留在那里。我发现只要在打印后将变量设置为空即可将其删除。看看我做了什么:
<p>To access my website please Login:</p>
<form name='login' action="./PHP_html/PHP/login.php" method='post'>
Username: <input type='text' name='username' /><div><?php print $_SESSION['baduser']; $_SESSION['baduser'] = "";?></div><br />
<div style="padding-left: 4px">Password: <input type='password' name='password' /><div><?php print $_SESSION['badpass']; $_SESSION['badpass'] = "";?></div></div>
<input type='submit' value='Login' /> or you can <a href="./Terms.php">Register</a>
我不知道这有什么用,但它对我有用。
另外,感谢你在这样的网站上发布的所有人,以帮助我们这些仍在学习的人。
答案 3 :(得分:0)
对于特定页面,您需要销毁会话,然后取消设置所有会话变量 使用
unset($_SESSION['varname']);
对于整个网站,您可以使用session_destroy();
答案 4 :(得分:0)
我解决了问题。首先获取当前的url然后chk页面停留在当前url.if页面不在当前url然后销毁会话。
$url = "http" . ((!empty($_SERVER['HTTPS'])) ? "s" : "") . "://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$page_name="abc.php";
if (!preg_match("/$page_name/",$url))
{
session_destroy();
}
但是这个代码应该在另一个页面上使用。因为http是一个无状态进程所以当用户离开页面时无法找到。
答案 5 :(得分:0)
您无法判断用户何时从页面中导航 ,这是不可能的。
您可以做的最好的事情是利用Cookie的工作方式。在开始会话时,您将向客户端发送cookie,该cookie在每次后续访问时标识客户端,从而激活关联的会话。由客户在随后的访问中发送此标识,由客户“忘记”他的身份。
您可以指示客户端仅发送某些页面的cookie,并且可以指示他在关闭浏览器时忘记cookie(生命周期为0)。这可以使用session_set_cookie_params
设置。
除此之外,您可以简单地忽略无关紧要的页面上的会话参数。当您假设客户端离开时,您可以在一段时间不活动后删除会话(或其某些值)。
答案 6 :(得分:0)
Borealid因为指向最优雅的解决方案而值得称赞。
更为便利的解决方案是在页面上保留一个iframe,该页面指向另一个“监视器”页面,该页面设置为每隔几秒刷新一次。这可以在没有JavaScript的情况下使用:
<meta http-equiv="refresh" content="10">
每10秒刷新一次监视器页面。发生这种情况时,监控页面可以记录服务器某处(DB或文件)的时间(覆盖先前记录的时间)和会话ID。
然后你必须创建一个cronjob来检查文件/数据库中是否有超过10~12秒的会话并手动删除它们。会话数据通常存储在名为sess_the-session-ID
的文件中的目录(由PHP配置指定)中。您可以使用这样的PHP函数:
function delete_session($sessId) {
$sessionPath = session_save_path();
// you'll want to change the directory separator if it's a windows server
$sessFile = "$sessionPath/sess_$sessId";
if (file_exists($sessFile) && unlink($sessFile)) return true;
return false;
}