如果用户在不按登出的情况下关闭浏览器,如何使其处于脱机状态

How to make offline status if the user close the browser without pressing logout?

本文关键字:何使其 于脱机 状态 脱机 浏览器 用户 情况下 如果      更新时间:2023-09-26

我有一个注销按钮,基于此我需要更新user-is:offline或online,但许多用户只是不使用该按钮,只是关闭浏览器。

按照以下代码进行了尝试,但它没有向服务器提交最后一个请求。如何做到这一点?

  $(window).bind('beforeunload', function(e) {  
    //if (id>=2) {
    //  return "WARNING: Your status is call connected. If you refresh now, software will lose all the connection status.";
    //} else {
    //  return "WARNING: Your status is not connected. You can refresh.";
    //}
    $.ajax({
      type    : "GET",//POST
      dataType: 'json',
      url     : '/php/makeunavailable',
      data    : url,
      async   : true,
      beforeSend: function() {
      },
      complete: function() {
      },
      success : function(msg) {
        // do nothing but make offline
      }
    });

  });

我做了一些类似于您在我的实验消息传递子系统中试图完成的的事情。

需要注意的一点是,您应该在服务器端强制执行空闲超时。使客户端每N秒通知服务器一次其存在,并将在N + L秒内未ping到的客户端视为离线,其中L表示一定量的预测延迟(在高端,以避免大量的"拍打")。

在客户端,与onbeforeunload相比,我在连接状态更改指示失败/中止时发送"最后一刻"请求的运气更好。诚然,这可能是由于我的代码中的一些非正统性。但是,浏览器在完全关闭窗口或选项卡之前自然会关闭连接。而且,它还有一个额外的优势,即当页面关闭之外的其他事情中止连接时会触发。所以,我运气很好。

我使用XmlHttpRequests,所以它看起来像这样,其中r是我的请求对象:

r.onreadystatechange = function() {
  if (r.readyState == 4) {
    if (r.status == 200) {
      // success logic
    } else if (r.status == 0 || r.responseText == '') {
      // assume the client aborted the connection
      issueLogoutRequest();
    } else {
      // failure logic
    }
  }
}

完整的客户端源代码可能有帮助,也可能没有帮助。(它很大。)如果你想四处看看,它可以在消息子系统中的pointless.com上看到

如果你使用的是WebSocket,我不能保证这个策略同样有效。但是,我会首先尝试绑定到oncloseonerror,看看它们是否允许您在最后一刻触发XmlHttpRequest

我对此并不完全确定,但请尝试使用$(window).on而不是$(window).bind。它们都应该有效,但我一直使用$(window).on。此外,您对function(e){的引用是什么?我的第一个未经测试的本能是使用:

$(window).on('beforeunload', function(){

如果您在服务器中使用php,只需使用$_SESSION,因为当用户关闭浏览器时,它将自动销毁。通过aru定义这个url的方式data : url,