监听浏览器刷新及关闭

需求背景: 为保证‘高度安全性’,用户每次退出页面或浏览器都要清除登录信息,每次进入系统都要从新登录(每次登录还要手机验证码等乱七八糟的验证信息,,,求用户的内心阴影面积),可是刷新页面不能够清除登录信息。
解决思路: javascript 对于浏览器的关闭和刷新会触发两个事件 onbeforeunload()onunload(),问题在于如何区分用户是想刷新仍是退出(此时应该将用户催眠,而后得到用户的思想,预判用户走位及操做。。。),本文主要记录这两个方法的区别,设备兼容性及如何催眠用户(开玩笑的),是如何区分刷新和退出浏览器

onbeforeunload()和onunload()

onbeforeunload 和 onunload 都是在页面刷新或退出时触发的事件

用法:javascript

事件 用法
onunload window.onunload=function(){SomeJavaScriptCode};
onbeforeunload window.onbeforeunload=function(){SomeJavaScriptCode};

区别:java

  1. unbeforeunload()是在页面刷新或关闭以前触发的事件,而onubload()是在页面刷新或关闭以后才会触发的。
  2. unbeforeunload()事件执行的顺序在onunload()事件以前发生。
  3. unbeforeunload()事件能够禁止onunload()事件的触发。
  4. onunload()事件是没法阻止页面关闭的。

兼容性(pc):ios

事件 Chrome Firefox IE Opera Safari
onunload yes yes yes yes yes
onbeforeunload 1 1 4 12 3

注意:onbeforeunoad 在移动端基本都不兼容,onunload则兼容大部分主流移动端浏览器浏览器

参考文献:
MDN: window.onbeforeunload
MDN: window.onunload

区分刷新和退出

在浏览器关闭前是没法判断用户是刷新仍是退出,因此咱们在用户再次打开的时候来判断用户是否刷新缓存

解决思路:安全

  1. 用户关闭浏览器时,记录当前时间,并存于浏览器缓存中
  2. 用户再次打开页面时,获取上次退出的时间,并于当前时间进行比较,若小于5s则表示用户执行的是刷新操做,若大于5s则断定为退出

注意: 5s并不是固定,要根据实际状况调整测试

上代码:localstorage

// 进入页面执行
// 记录当前时间并转成时间戳
const now = new Date().getTime();
// 从缓存中获取用户上次退出的时间戳
const leaveTime = parseInt(localStorage.getItem('leaveTime'), 10);
// 判断是否为刷新,两次间隔在5s内断定为刷新操做
const refresh = (now - leaveTime) <= 5000;
// 测试alert
alert(refresh ? '刷新' : '从新登录');

// 退出当前页面执行
window.onunload = function(e){ // ios 不支持 window.onbeforeunload()
  // 将退出时间存于localstorage中
  localStorage.setItem('leaveTime', new Date().getTime());
}
相关文章
相关标签/搜索