关闭浏览器选项卡时取消设置会话


Unset Session When browser tab is closed

当用户进入网站时,它会发送一个默认语言,同时它会强制用户从列表中选择一种语言…
当用户选择语言时,它设置$_SESSION['language'] = $_POST['lg'];
同时,我设置了另一个$_SESSION['sestime'] = time();
对于这个会话,我可以这样做:

if(isset($_SESSION['sestime']) && (time() - $_SESSION['sestime'] > 600)) {
session_unset(); session_destroy();
header("Location: $sred");
exit;
}
$_SESSION['sestime'] = time();

如果在10分钟内没有活动,它会销毁/删除/取消设置任何会话,其想法是再次询问语言…现在,这是"工作",但我想要的是远离"检测"当用户即将关闭浏览器选项卡,网站选项卡…如果用户关闭标签然后"销毁/删除/取消设置"任何会话为这个网站…
这可能吗?

会话cookie通常在发送时没有过期时间,这意味着它们在浏览器关闭时被删除,因此会话无论如何都会丢失。

1)当用户关闭浏览器而未点击登出时销毁或取消会话

您可以为会话数据设置一个过期时间,使用每个session_start调用测试它,如果会话过期则销毁会话:

session_start();
if (!isset($_SESSION['EXPIRES']) || $_SESSION['EXPIRES'] < time()+3600) {
    session_destroy();
    $_SESSION = array();
}
$_SESSION['EXPIRES'] = time() + 3600;

2)当浏览器TAB关闭时销毁会话

使用自己的方法实现会话超时。使用一个简单的时间戳来表示上次请求的时间,并在每次请求时更新它:

你需要编写类似的代码

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // request 30 minates ago
    session_destroy();
    session_unset();
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time

3)如何改变PHP的会话超时?

session_start(); // ready to go!
$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
    // this session has worn out its welcome; kill it and start a brand new one
    session_unset();
    session_destroy();
    session_start();
}
// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;

4)卸载事件被发送到窗口元素时,用户导航离开页面。这可能意味着很多事情中的一件。用户可以点击链接离开页面,或者在地址栏中输入新的URL。前进和后退按钮将触发事件。关闭浏览器窗口将触发该事件。即使页面重新加载也会首先创建一个卸载事件。

$( window ).unload(function() {
  //use ajax to call another page to session_destroy();
});

问题是:如果用户在您的站点上打开了两个或多个选项卡,该怎么办?如果他们关闭一个选项卡,另一个将有效地注销。

在TAB上更改或销毁javascript会话值的最佳方法关闭

var data=sessionStorage.getItem("data");
var sessiondomain=sessionStorage.getItem("domain");
var domain=window.location.hostname;
if(data == null && sessiondomain == null) {
  sessionStorage.setItem("data", "1");
  sessionStorage.setItem("domain", window.location.hostname);
  $("#dd").show();
}else if(data==1 && sessiondomain==domain){
  $("#dd").show();
}
$(document).ready(function(){
  $("#clickme").click(function(){
     sessionStorage.setItem("data", "0");
     sessionStorage.setItem("domain", "0");
  });
});

使用ajax来自动销毁会话'

<script>        
window.addEventListener("beforeunload", function () {         
      $.ajax({ 
          type: "POST", 
          url: "logout.php",  
       
      }); 
    }); 
</script>`