我知道这个问题可能已被问过太多次了,但我找不到符合我需求的解决方案,而且其他OP所描述的案例与我的略有不同。
我有单页应用程序,所以在应用程序导航中(点击锚点等)不是问题。
我需要在关闭浏览器的标签页或导航时注销用户:例如另一个域。
如果他只是刷新浏览器,不希望注销用户
(注销是通过POST到api服务器的特定URL完成的,请求可以是同步的,也可以使用Beacon API - 这不是问题)。
但问题是如何区分刷新与导航或关闭浏览器选项卡。
我知道在onbeforeunload
事件处理程序中,无法知道浏览器尝试导航到的新目标网址是什么。
检测到用户点击F5 / Cmd + R / Ctrl + R是不够的,因为有人可能只是点击浏览器工具栏按钮进行刷新。或者选择从Safari中的“查看”菜单进行刷新,例如
我考虑过记录到localStorage上一个beforeunload
事件的时间戳,然后在页面加载时进行比较,并设置如果两个事件发生的时间少于2秒,例如然后它可能是一个刷新。但是又有人可能会篡改本地存储和私人模式Safari没有本地存储...
解决方案可能涉及客户端更改和服务器更改。
有什么想法吗?