【发布时间】:2009-08-29 13:41:37
【问题描述】:
Javascript onUnload 有替代方案吗?我使用带有 Servlets 的 JSP Jakarta Struts 框架。
我必须知道,什么时候关闭窗口,因为不是每个人都点击注销按钮。
您如何在应用程序中处理它?
【问题讨论】:
标签: javascript jsp servlets struts onunload
Javascript onUnload 有替代方案吗?我使用带有 Servlets 的 JSP Jakarta Struts 框架。
我必须知道,什么时候关闭窗口,因为不是每个人都点击注销按钮。
您如何在应用程序中处理它?
【问题讨论】:
标签: javascript jsp servlets struts onunload
一般而言,无法最终确定访问者是否仍在“使用”(甚至查看)您的网页。一旦浏览器下载了页面,它就不再与服务器联系,所以页面可能会保持打开几秒钟或几年,而服务器不会知道。
unload 事件无疑是一个有用的线索,因为它通常在页面卸载时触发。然而,这根本不可靠。有很多情况下它不会触发,还有很多情况下即使它触发了你的服务器也不会意识到它。
例如:浏览器(甚至操作系统)可能会崩溃,或者电源可能会断电。使用 Wi-Fi 的访问者在使用您的网站时可能会断开连接,或者可能会将她的 iPhone 带入隧道。
对此的标准解决方法(我们都承认这很糟糕)是让访问者的会话超时。即使在高风险的银行网站上,您也会发现,如果您离开计算机四分钟然后回来,您仍然可以访问,但如果您离开五分钟,您就会被锁定。
这种设置肯定会发现很多误报:访问者仍在使用您的页面而没有与之交互的情况,因此超时给您带来不便。它还允许误报:真实访问者已经离开,恶意用户在超时期限内接管的情况。
我们最近看到的对该方案的唯一主要补充是利用 JavaScript 在超时期限后明显地注销用户。再次,我们在银行网站上看到了这一点:让页面打开太久,当你回来时,你会看到一个登录屏幕。 (当然,这也依赖于 JavaScript,因此仍然是错误的。)
不幸的是,由于 HTTP 是一种无状态协议,我们永远无法确定浏览器中发生了什么(尤其是在 JavaScript 关闭的情况下),因此我们可以使用廉价的解决方法。
【讨论】:
您应该知道 Opera 不会像您所怀疑的那样执行 onUnload。而且你不应该依赖 javascript 来查看用户是否关闭了窗口。
【讨论】:
我依靠 servlet 会话超时来自动处理注销。您可以在会话超时时注册一个处理程序,以涵盖您需要执行的任何凭证清理。这里给出了一个很好的例子:
http://www.xyzws.com/Servletfaq/when-do-i-use-httpsessionlistener/7
客户端无法保证用户始终确认他们已完成对您网站的使用。
【讨论】:
我使用onbeforeunload。 See the documentation
经过测试,它似乎可以在 Firefox、Chrome、IE11 和 Edge 上运行。
我没有测试任何其他浏览器。(compatibility list is here)
【讨论】: