处理选项卡关闭时注销而不是刷新时注销的更好方法?

问题描述 投票:0回答:1

我有一个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();
?>
javascript php
1个回答
0
投票

您无法可靠地将信号从客户端设备传回服务器以表示会话结束。这就是浏览器/HTTP/网络的一般工作方式。

如果您希望客户端浏览器在浏览器/选项卡关闭时丢弃会话 cookie,只需将 cookie 过期时间设置为零,浏览器就会为您完成此操作。

服务器端,如果您有需要清除的数据或需要为结束的会话执行任务,那么您需要在声明会话“结束”并定期进行操作之前决定经过多长时间没有交互负责这个的工作。这个细节将是一个全新的问题,必然需要包括需要清理的内容以及原因。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.