关闭页面时执行“退出”的解决方案
在有些应用中我们需要实时的更新站点用户是否在线的状态。比如一些论坛里的在线成员实时显示,或基于网页的聊天、会议系统等。这种情况下,如果用户点击“退出”按钮或链接,我们将之行一系列后台操作,将该用户标识成off line状态;但如果用户直接关闭浏览器的话,就需要我们想办法来更新用户的状态。
下面是我总结的几种解决方案,请高手们指教:
第一类:服务端解决
1.如果Session是InProc的话,那么在不需要严格实时的应用中,使用 session_end 事件+合理的Session生命期 是最好的选择
我们都知道,在用户浏览器打开网页,访问我们的ASP.NET程序时,服务器会根据浏览器分配给客户端一个全局唯一的SessionID,同时执行Global.asax中的Session_Start事件, 当浏览器关闭或我们在WebConfig中设置的Session生命期过期时,将会关闭这个会话,同时执行 Session_End 事件。
据此,如果用户关闭浏览器,我们则可以在Session_End事件中执行将该用户标识成offline的代码。
第二类:客户端解决
相比服务端解决方案,客户端解决方案比较繁琐复杂(需要在所有相关页面中设置),而且很有局限性,但在一些特殊的应用中也是非常适合的。
1.捕获onbeforeunload或onunload事件
如果我们在<body>中设置了onbeforeunload或onunload事件函数,那么当浏览器关闭时,将会先后执行这两段JavaScript方法,据此,在一些实时性要求很高的应用中,比如在线会议,如果用户关闭了页面,需要马上将状态反馈给服务端。这种情况下,我们可以在JavaScript方法中调用WebService来告诉服务端,用户已经offline了。
为了提高Javascript代码的效率,我们可以用捕获鼠标关闭事件来判断是用户点击了“X”关闭页面,还是其它情况下的离开页面,代码如下:
{
//Call Server method;
}
2.定时向服务器汇报状态
在上一种客户端方案中,如果客户端突然断电,则可能无法及时更新状态。
我们知道,在JavaScript中有类似于Timer的setInterval和setTimeout函数,我们可以利用这个函数来每隔一段时间之行一段代码:
//or
setInterval("SomeJavascriptFunction()",nTimeoutinMilliseconds,"Language");
据此,我们可以在客户端每隔一段时间到服务器汇报在线状态,如果一定时间内服务器接收不到客户端的状态更新,则视为offline
3.非AJAX的方法
使用传统表单提交的方法貌似可以达成,以下代码来自palanisaami ,但未经测试
{
document.getElementById("Form1").action="Signout.aspx";
document.getElementById("Form1").submit();
}
关闭页面时执行“退出”的解决方案相关推荐
- JavaScript的onunload()方法在关闭页面时不执行
以下仅确定适用于IE11. 解决办法:将onunload()方法换为onbeforeunload(). <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
- session 安全问题(关闭页面时自动清除session)
要是直接关闭浏览器,并不直接触发SESION_ONEND事件,因此为了安全的需要,就需要调用页面关闭触发的事件onUnload ,利用这个事件来执行一个函数.在函数中调用session.abandon ...
- asp.net如何在用户关闭浏览器时执行Session_End方法
查看文章 asp.net如何在用户关闭浏览器时执行Session_End方法 2009-12-02 16:35 1.建两个页面king.aspx,leave.aspx,和一个Global. ...
- 你知道关闭页面时怎么向后台发送消息吗?
需求 这两天碰到一个需求:在用户刷新页面或者关闭页面的时候,前端要给后台发一条请求,释放该页面的授权占用. 分析了一下,这不就是在页面卸载时发请求嘛,三下五除二就实现一版: window.addEve ...
- php 页面关了还在执行,php关闭页面仍执行的实现方法
在php中可以通过"ignore_user_abort"函数实现关闭页面仍执行的功能,其语法是"ignore_user_abort(true); ",表示尽管C ...
- js 关闭页面时弹框提醒
关闭页面时弹框提醒 在做vue项目时一个可编辑的详情页面需要在离开它的时候,根据页面是否改动的情况来判断是否要离开页面,一开始我只是在beforeRouteLeave里面调用的==window.con ...
- Taro关闭页面时停止计时器
1.在data中定义Loadingtime:'' constructor () {super(...arguments)this.state = {djsTime:3, // 倒计时时间Loading ...
- 关闭页面时向后台发送消息
语法: navigator.sendBeacon(url, data); 返回值: 当用户代理成功把数据加入传输队列时,sendBeacon() 方法将会返回 true,否则返回 false. 代码: ...
- vue关闭页面时停止计数器
vue启动停止setInterval data () {return {clearTimeSet:null,} }, mounted () {// 启动this.clearTimeSet = setI ...
最新文章
- 华为的全闪存存储发展历程
- WORD2007只可以打开一个文档,且打开后文本有时出现不可 编辑情况
- android 4.0(ICS)源码下载方法
- 皮一皮:误删了一段代码后系统还能跑起来!
- linux中的五大查找命令---whereis,find,locate,which,type
- SQLite 日期 时间
- SpringBoot的@SpringBootApplication注解和其他几个注解
- 未能加载文件或程序集“Microsoft.Office.Interop.Owc11, Version=11.0.0.0, ...”或它的某一个依赖项~[解决方案]...
- 浅谈python中的一般方法、静态方法(staticmethod)和类方法(classmethod)
- 面试题,如何改进一款产品
- 【分享创造】react-typewriter-hook: 用react hooks来实现打字机的效果
- 生活记录--考研日记(1)
- 你熟知的开源项目,幕后推手竟然是他们?
- 这款耳机的性价比堪比AirPods,有点酷!
- win7登录密码破解工具
- Android4.4 Input 输入上层分析
- 基于Android的手机邮件收发(JavaMail)之四(邮件的发送)
- 以机房B级建设标准满足等保2.0三级要求 | 混合云基础设施
- 点源时域麦克斯韦方程AI求解
- 群晖NAS中对Gitlab配置邮箱发送消息_以163邮箱为例
热门文章
- 如何定位cpu占用率高的java线程
- 对象的notify方法的含义和对象锁释放的三种情况
- Learn Python 011: while loop
- 斯隆-凯特琳癌症中心使用RTLS系统,改善患者术后护理流程
- Zeppelin:用于区块链应用的开源安全智能合约架构
- 如何将github上源代码导入eclipse中
- 点击空白 键盘消失 (待续……)
- 如何复制代码到剪贴板?JS/FLASH...
- asp and asp.net trips
- SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)...