用户直接关闭浏览器如何自动退出
一般搜索结果都是一个监听事件, 即 onunload 或 onbeforeunload 事件, 但有一个致命性的缺陷, 那就是当用户刷新的时候这些事件同样也会触发. 这时候如何区分成为了难题.
这里给出一个区分的思路:
首先在浏览器内监听两个事件, 一个是载入事件 load, 另一个是销毁前的事件 onbeforeunload, 用户刷新后, 一定是先触发销毁事件然后是载入事件. 就是利用了这个顺序完成的监听过程.
触发销毁事件, 事件内部发送给后台一个请求,携带参数 eventName=load , 后台接收后先不要直接退出, 而是生成一个十秒左右的定时器, 定时器在十秒后自动注销当前账户. 用户刷新并触发载入事件时, 事件内部同样发送后台一个请求,携带参数 eventName=unload 后台接收后取消定时器.
如果是关闭浏览器, 则只触发上一步, 十秒后依然会自动退出. 这样就达到区分的目的了.
示例代码:
// 前端载入页面事件
window.onload = function () {let httpRequest = new XMLHttpRequest() // 第一步:建立所需的对象httpRequest.open('POST', '/user/logout') // 第二步:打开连接httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')httpRequest.send('eventName=load') // 第三步:携带参数httpRequest.onreadystatechange = function () {}
}
// 前端销毁页面事件
window.onbeforeunload = function () {let httpRequest = new XMLHttpRequest() // 第一步:建立所需的对象httpRequest.open('POST', '/user/logout') // 第二步:打开连接httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')httpRequest.send('eventName=unload') // 第三步:携带参数httpRequest.onreadystatechange = function () {}
}
// 后端 java 处理事件
// 使用 SaToken 进行演示
@PostMapping("/user/logout")
public void logout(String eventName) {if (!StpUtil.isLogin()) {System.out.println("未登录状态下什么都不做");return;}System.out.println("执行退出: " + eventName);if (eventName == null) {System.out.println("用户正常点击按钮退出");StpUtil.logout();} else {SaSession session = StpUtil.getSession();String timerKey = "userCloseEventTimer";if ("unload".equals(eventName)) {System.out.println("10秒后退出");Integer loginId = StpUtil.getLoginIdAsInt();// 开启定时TimerTask timerTask = new TimerTask() {@Overridepublic void run() {System.out.println("自动退出");StpUtil.logout(loginId);}};Timer timer = new Timer();timer.schedule(timerTask, 10_000); // 控制时长session.set(timerKey, timer);} else if ("load".equals(eventName)){// 关闭定时if (session.has(timerKey)) {System.out.println("取消退出");Timer timer = session.getModel(timerKey, Timer.class);timer.cancel();session.delete(timerKey);}}}
}
十秒只是一个范围, 可以动态修改.
参考文献: load事件 beforeunload事件
用户直接关闭浏览器如何自动退出相关推荐
- 用户直接关闭浏览器,直接退出登陆的实现方法【php+thinkphp】
问题背景:为了用户安全,想让用户关闭浏览器后,直接退出. 一直想着用JavaScript的方式解决这个问题,然后发现并不是那么容易解决的,中间出现各种问题,弄起来也很复杂.后面发现是自己对Cookie ...
- php cookie突然没,PHP利用Cookie设置用户30分钟未操作自动退出功能
登陆控制器需要做的登陆成功把用户ID等信息存入cookie: $this->systemSetKey(array('name'=>$admin_info['admin_name'], 'i ...
- php登录后自动退出登录,PHP利用Cookie设置用户30分钟未操作自动退出功能
登陆控制器需要做的登陆成功把用户ID等信息存入cookie: $this->systemSetKey(array('name'=>$admin_info['admin_name'], 'i ...
- 如何判断用户是否关闭浏览器
主要应用场景,比如web聊天室等.解决问题,用户退出聊天,服务器该用户的进程还存在.如果太多进程会造成服务器僵尸进程太多导致服务器运行缓慢,宕机.
- CMD命令行Chrome自动网页截图到文件,截图完后自动退出浏览器
Taking screenshots 截图 To capture a screenshot of a page, use the --screenshotflag: 要对页面截图,只需使用--scre ...
- 关闭页面时执行“退出”的解决方案
在有些应用中我们需要实时的更新站点用户是否在线的状态.比如一些论坛里的在线成员实时显示,或基于网页的聊天.会议系统等.这种情况下,如果用户点击"退出"按钮或链接,我们将之行一系列后 ...
- 关闭浏览器 清除cookie
根据客户要求使用dedecms v5.6版本,发现了一个会员登录的bug!看来dedecms也不过如此! 首先说说bug所在:在会员登录页面 /member/index.php 登录的时候 有效期如果 ...
- javascript兼容性:IE6/7关闭浏览器操作
通过javascript关闭浏览器的时候,"一般"会弹出系统的默认提示框,提示用户是否关闭浏览器,这可以通过javascript解决,但是IE6,IE7解决的办法是不一样的. 代码 ...
- 关闭浏览器窗口的时候,如何清空localStorage的数据
关闭浏览器窗口的时候,如何清空localStorage的数据 一.对于单页面应用,例如vue等 二.对于多页面应用 1.第一种方案(对于vue) 2.第二种方案(对于原生js) 一.对于单页面应用,例 ...
最新文章
- Python map() ==>根据提供的函数对指定序列做映射
- 360极速模式和兼容模式对页面的影响
- ZJU cluster
- 定义一个Employee类,排序
- web.xml 加载顺序
- python 查询ip工具
- macOS 11 Big Sur 开启 2K 分辨率的 HiDPI 模式(五分钟完成)
- 工程、技术与工程师三者之间的相互关系
- 三级等保成标配,互联网医院安全架构报告发布
- Linux内核之 module_init解析 (下)
- rocksdb配置解析
- 深度学习和神经网络的区别是什么
- 牛奶可乐经济学之Q4:为什么下雨天出租车司机却提前下班?
- java分页查询_java实现分页查询
- WKT创建shapefile、shapefile输出WKT
- Hadoop——(Hadoop框架,Hadoop的优缺点,Hadoop1.x和2.x的版本区别,Hadoop架构,Hadoop目录结构)
- 字符串查找函数 php,php字符串查找函数(strrpos与strchr)
- CRM管理系统,打造企业发展软实力
- mysql主要学什么_mysql学什么
- vue项目利用uuid生成唯一随机字符串判定临时游客
热门文章
- Java web连接数据库实现登录功能 ; jsp连接MySQL或SQL server数据库的jar包也在这里哦!
- javax.naming.CommunicationException:simple bind faild
- You have an error in your SQL syntax +改动数据库表名后异常(已解决)【MySQL+SSM】
- 基于webrtc的视频聊天室(一)之千里之行始于足下
- 【tarjan强连通分量】洛谷P1726 上白泽慧音
- Spring Security:探索 JDBC 身份验证
- 【梦幻连连连】源码分析(二)
- Swift:瀑布流 网络加载图片 Swift 5.0
- 一个最简单的Lucene例子
- XART------generate art ascii texts.