我的脚本使用" onbeforeunload",ajax和logout.php(以登录状态1或0更新mysql)以提供" live"用户登录状态。这样,如果用户关闭他们的选项卡,或者希望他们关闭浏览器(未经测试),mysql将能够跟踪他们的登录状态,而如果我监视cookie,他们仍然会显示为使用他们的活动会话登录。
问题是这会使每个页面刷新或点击的href链接都将我注销。
我尝试通过向onbeforeunload调用的ajax添加if语句来解决这个问题。如果变量说" var unload == true",这将执行ajax注销。我的header.php脚本在所有网站页面上,我添加了var unload = true;它。(在每个页面加载时重置由onbeforeunload触发的ajax)
对于我的链接,我尝试使用onclick来关闭"关闭"通过设置unload = false来注销ajax。 它应该是"打开"再次使用header.php的代码var unload = true,因为它位于每个页面上。
现在它已关闭,并且onbeforeunload不会触发带有F5刷新或关闭标签的ajax注销。
if语句是否无法识别变量?他们是一个更好的方式来解决这个问题吗?一如既往,我非常感谢您的见解和帮助。谢谢。
以下是适用的代码。(我尝试使用localstorage变量。没有运气......)
的header.php:
<script>
localStorage.setItem("unload","true");
window.onbeforeunload = function() {
if(localStorage.getItem('unload')=="true"){
$.ajax({
async:false,
type:"POST",
url: "/WIP/secure_login/logout.php",
enctype: 'multipart/form-data',
success: function(resp){
window.alert("you should be logged out now.");
}
});
}
};
document.getElementsByClassName("nav-link").addEventListener("click",
function(){
localStorage.setItem("unload","false");
};
</script>
demo.php
<?php
include '../header.php';
?>
<script>
document.getElementById("submit").addEventListener("click", function(){
localStorage.setItem("unload","false");
$.ajax({
async:true,
type:"POST",
url: "../header.php",
enctype: 'multipart/form-data',
success: function(result){
location.reload();
}
});
});
localStorage.setItem("unload","true");
</script>
答案 0 :(得分:0)
期望是确定谁是主动“登录”而谁不是。您当前的方法是错误的。您可以按如下方式实现目标:
首先 -
创建一个新页面,称之为pulse.php
。这个php文件将负责查询$ currentUser的 Users 表并更新时间戳(例如:updated_at
)并可能设置一个布尔列(例如:active
)为真。这是可选的,取决于您的用户模型架构。
下一个 - 将以下javascript添加到header.php:
const getPulse = () => $.get("/pulse.php");
setInterval(getPulse, 300000); // This fn will be fired every 5 minutes
最后 -
设置一个计划任务(即cron作业),在服务器上每5分钟运行一次。此任务将负责查询USER.updated_at time is longer than 5 minutes from NOW() AND USER.active = true
中的Users表。 此查询返回的任何结果都将是不再主动联机的用户(即关闭其浏览器标签)。您现在可以相应地更新这些用户记录。