我有一个js代码,使用sessionStorage仅在选项卡关闭时注销,但它并不像我想要的那么顺利
if (sessionStorage.getItem('reloaded') != null) {
console.log('page was reloaded');
} else {
console.log("page was closed");
fetch('logout.php', {
method: 'POST', // Use POST for sensitive actions like logout
headers: {
'Content-Type': 'application/x-www-form-urlencoded', // Content type
},
})
.then(response => {
if (response.ok) {
console.log('Logged out successfully');
window.location.replace("http://localhost/foodblog/index.php");
} else {
console.log('Logout failed');
}
})
.catch(error => {
console.error('Error during logout:', error);
});
}
sessionStorage.setItem('reloaded', 'yes');
这会在页面加载时显示重定向,我认为它看起来有点糟糕,我也尝试使用 “卸载”事件监听器:
window.addEventListener('unload', function () {
navigator.sendBeacon('logout.php');
});
这工作得很好,但卸载已被弃用,知道如何改进吗?
注销.php:
<?php
session_start();
if(isset($_SESSION["user_id"])){
unset($_SESSION["user_id"]);
}
if(isset($_SESSION["username"])){
unset($_SESSION["username"]);
}
session_destroy();
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 3600, '/');
}
header("Location: index.php");
exit();
?>
您无法可靠地将信号从客户端设备传回服务器以表示会话结束。这就是浏览器/HTTP/网络的一般工作方式。
如果您希望客户端浏览器在浏览器/选项卡关闭时丢弃会话 cookie,只需将 cookie 过期时间设置为零,浏览器就会为您完成此操作。
服务器端,如果您有需要清除的数据或需要为结束的会话执行任务,那么您需要在声明会话“结束”并定期进行操作之前决定经过多长时间没有交互负责这个的工作。这个细节将是一个全新的问题,必然需要包括需要清理的内容以及原因。