【问题标题】:I want to detect when user close browser window?我想检测用户何时关闭浏览器窗口?
【发布时间】:2010-12-13 03:10:45
【问题描述】:

我有示例,当用户关闭他的浏览器窗口时,我需要终止会话。 我试过 page_unload() 不工作。 示例是:我有父窗口,窗口将从它打开我需要在用户关闭子窗口时删除会话。 请问我需要一些帮助。

【问题讨论】:

标签: javascript c# asp.net webforms


【解决方案1】:

这不是普通网络 http 协议所提供的。没有真正的方法可以确定浏览器何时关闭。你只能“有点”知道。您必须拼凑出一个丑陋的 hack 以获得任何程度的确定性,即便如此,它也一定会在大量边缘情况下失败或导致令人讨厌的副作用。

正常的解决方法是每隔一段时间从浏览器向您的服务器发送 ajax 请求,以设置一种“心跳”。当心跳停止时,浏览器关闭,因此您终止会话。但同样:这是一个可怕的黑客攻击。在这种情况下,主要问题是如果服务器和客户端不同步或存在 javascript 错误,很容易误报心跳失败,并且有一个副作用是您的会话将永远不会自行过期。

【讨论】:

  • +1:唯一的例外是,如果您正在运行某种与服务器持续通信的内联 Java(或类似)小程序,唯一有效的原因是因为它是在常规 HTML 频道之外运行。 HTML 不是一个有状态的协议,任何尝试使它如此使用 javascript 的方法充其量只是一种 hack。
  • 现在还是这样吗,因为现在有办法检查吗?还是还是像这样 hacky?
  • @stephano 还是这种情况。这是 HTTP 工作原理的基本组成部分:浏览器发送请求,您做出响应,并且不能假设进一步的通信。完全没有。您可以做的最好的事情是自己或使用库实现心跳,这同样会在许多边缘情况下失败并误导您。
  • 我正在尝试计算 WebRTC 调用的持续时间,因为没有太多好的选择,我们拥有的最可靠的方法是什么?你会: - 设置一个 WebSocket 心跳,让后端服务器不断检查前端是否已连接? - 向后端发送定期更新,告诉后端呼叫仍然连接?
  • 这听起来像是一个单独的问题。
【解决方案2】:

你有父窗口中所有子窗口的引用 你需要 onfocus 来检查子窗口 所以当你的父母得到焦点时,检查孩子是否在那里

【讨论】:

    【解决方案3】:

    如果您的客户端脚本向您的服务器端应用发送了 AJAX 心跳,您可能会使用丢失的心跳来关闭会话。

    【讨论】:

      【解决方案4】:

      您可以使用回发到退出页面的 window.onbeforeunload 处理程序来执行此操作。

      function CloseSession( )
      {
          location.href = 'SignOut.aspx'; 
      }
      window.onbeforeunload = CloseSession;
      

      这是重复问题.. chk out here

      Closing the browser should actually clear the session variables an ASP.net session id

      https://stackoverflow.com/questions/920042/kill-server-side-session-on-browser-window-close-closed

      【讨论】:

      • 不保证 onbeforeunload 会触发。
      【解决方案5】:

      没有一致的方法来检测通过 javascript 关闭的浏览器。如果您担心有太多会话挂起,请减少服务器上的会话超时。如果您这样做,您还需要通知您的用户,他们需要保持活跃,以免丢失任何工作。

      【讨论】:

        【解决方案6】:

        很遗憾,这是不可能的。您可以在网络上找到声称他们可以做到这一点的示例,但它们有时会以非常微妙的方式存在缺陷。

        【讨论】:

          猜你喜欢
          • 2010-10-22
          • 2016-10-05
          • 1970-01-01
          • 2021-11-06
          • 2017-01-09
          • 1970-01-01
          • 1970-01-01
          • 2014-02-09
          相关资源
          最近更新 更多