【问题标题】:Alternative for JavaScript onUnloadJavaScript onUnload 的替代方案
【发布时间】:2009-08-29 13:41:37
【问题描述】:

Javascript onUnload 有替代方案吗?我使用带有 Servlets 的 JSP Jakarta Struts 框架。

我必须知道,什么时候关闭窗口,因为不是每个人都点击注销按钮。
您如何在应用程序中处理它?

【问题讨论】:

    标签: javascript jsp servlets struts onunload


    【解决方案1】:

    一般而言,无法最终确定访问者是否仍在“使用”(甚至查看)您的网页。一旦浏览器下载了页面,它就不再与服务器联系,所以页面可能会保持打开几秒钟或几年,而服务器不会知道。

    unload 事件无疑是一个有用的线索,因为它通常在页面卸载时触发。然而,这根本不可靠。有很多情况下它不会触发,还有很多情况下即使它触发了你的服务器也不会意识到它。

    例如:浏览器(甚至操作系统)可能会崩溃,或者电源可能会断电。使用 Wi-Fi 的访问者在使用您的网站时可能会断开连接,或者可能会将她的 iPhone 带入隧道。

    对此的标准解决方法(我们都承认这很糟糕)是让访问者的会话超时。即使在高风险的银行网站上,您也会发现,如果您离开计算机四分钟然后回来,您仍然可以访问,但如果您离开五分钟,您就会被锁定。

    这种设置肯定会发现很多误报:访问者仍在使用您的页面而没有与之交互的情况,因此超时给您带来不便。它还允许误报:真实访问者已经离开,恶意用户在超时期限内接管的情况。

    我们最近看到的对该方案的唯一主要补充是利用 JavaScript 在超时期限后明显地注销用户。再次,我们在银行网站上看到了这一点:让页面打开太久,当你回来时,你会看到一个登录屏幕。 (当然,这也依赖于 JavaScript,因此仍然是错误的。)

    不幸的是,由于 HTTP 是一种无状态协议,我们永远无法确定浏览器中发生了什么(尤其是在 JavaScript 关闭的情况下),因此我们可以使用廉价的解决方法。

    【讨论】:

    • 我不会说这是不可能,只是非常困难。总是有 Flash + 网络摄像头 + 运动检测 + 人脸检测。
    【解决方案2】:

    您应该知道 Opera 不会像您所怀疑的那样执行 onUnload。而且你不应该依赖 javascript 来查看用户是否关闭了窗口。

    【讨论】:

      【解决方案3】:

      我依靠 servlet 会话超时来自动处理注销。您可以在会话超时时注册一个处理程序,以涵盖您需要执行的任何凭证清理。这里给出了一个很好的例子:

      http://www.xyzws.com/Servletfaq/when-do-i-use-httpsessionlistener/7

      客户端无法保证用户始终确认他们已完成对您网站的使用。

      【讨论】:

        【解决方案4】:

        我使用onbeforeunload。 See the documentation

        经过测试,它似乎可以在 Firefox、Chrome、IE11 和 Edge 上运行。

        我没有测试任何其他浏览器。(compatibility list is here)

        【讨论】:

          猜你喜欢
          • 2016-09-30
          • 1970-01-01
          • 1970-01-01
          • 2017-04-05
          • 2014-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多