在有些应用中我们需要实时的更新站点用户是否在线的状态。比如一些论坛里的在线成员实时显示,或基于网页的聊天、会议系统等。这种情况下,如果用户点击“退出”按钮或链接,我们将之行一系列后台操作,将该用户标识成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”关闭页面,还是其它情况下的离开页面,代码如下:

if(window.event.clientY < 0 && window.event.clientY < -80)
{
     //Call Server method;
}

2.定时向服务器汇报状态

在上一种客户端方案中,如果客户端突然断电,则可能无法及时更新状态。

我们知道,在JavaScript中有类似于Timer的setInterval和setTimeout函数,我们可以利用这个函数来每隔一段时间之行一段代码:

setTimeout("SomeJavascriptFunction()",nTimeoutinMilliseconds,"Language");   
  //or   
setInterval("SomeJavascriptFunction()",nTimeoutinMilliseconds,"Language");   

据此,我们可以在客户端每隔一段时间到服务器汇报在线状态,如果一定时间内服务器接收不到客户端的状态更新,则视为offline

3.非AJAX的方法

使用传统表单提交的方法貌似可以达成,以下代码来自palanisaami ,但未经测试

function Signout()
{
    document.getElementById("Form1").action="Signout.aspx";
    document.getElementById("Form1").submit();

关闭页面时执行“退出”的解决方案相关推荐

  1. JavaScript的onunload()方法在关闭页面时不执行

    以下仅确定适用于IE11. 解决办法:将onunload()方法换为onbeforeunload(). <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  2. session 安全问题(关闭页面时自动清除session)

    要是直接关闭浏览器,并不直接触发SESION_ONEND事件,因此为了安全的需要,就需要调用页面关闭触发的事件onUnload ,利用这个事件来执行一个函数.在函数中调用session.abandon ...

  3. asp.net如何在用户关闭浏览器时执行Session_End方法

      查看文章     asp.net如何在用户关闭浏览器时执行Session_End方法 2009-12-02 16:35 1.建两个页面king.aspx,leave.aspx,和一个Global. ...

  4. 你知道关闭页面时怎么向后台发送消息吗?

    需求 这两天碰到一个需求:在用户刷新页面或者关闭页面的时候,前端要给后台发一条请求,释放该页面的授权占用. 分析了一下,这不就是在页面卸载时发请求嘛,三下五除二就实现一版: window.addEve ...

  5. php 页面关了还在执行,php关闭页面仍执行的实现方法

    在php中可以通过"ignore_user_abort"函数实现关闭页面仍执行的功能,其语法是"ignore_user_abort(true); ",表示尽管C ...

  6. js 关闭页面时弹框提醒

    关闭页面时弹框提醒 在做vue项目时一个可编辑的详情页面需要在离开它的时候,根据页面是否改动的情况来判断是否要离开页面,一开始我只是在beforeRouteLeave里面调用的==window.con ...

  7. Taro关闭页面时停止计时器

    1.在data中定义Loadingtime:'' constructor () {super(...arguments)this.state = {djsTime:3, // 倒计时时间Loading ...

  8. 关闭页面时向后台发送消息

    语法: navigator.sendBeacon(url, data); 返回值: 当用户代理成功把数据加入传输队列时,sendBeacon() 方法将会返回 true,否则返回 false. 代码: ...

  9. vue关闭页面时停止计数器

    vue启动停止setInterval data () {return {clearTimeSet:null,} }, mounted () {// 启动this.clearTimeSet = setI ...

最新文章

  1. 华为的全闪存存储发展历程
  2. WORD2007只可以打开一个文档,且打开后文本有时出现不可 编辑情况
  3. android 4.0(ICS)源码下载方法
  4. 皮一皮:误删了一段代码后系统还能跑起来!
  5. linux中的五大查找命令---whereis,find,locate,which,type
  6. SQLite 日期 时间
  7. SpringBoot的@SpringBootApplication注解和其他几个注解
  8. 未能加载文件或程序集“Microsoft.Office.Interop.Owc11, Version=11.0.0.0, ...”或它的某一个依赖项~[解决方案]...
  9. 浅谈python中的一般方法、静态方法(staticmethod)和类方法(classmethod)
  10. 面试题,如何改进一款产品
  11. 【分享创造】react-typewriter-hook: 用react hooks来实现打字机的效果
  12. 生活记录--考研日记(1)
  13. 你熟知的开源项目,幕后推手竟然是他们?
  14. 这款耳机的性价比堪比AirPods,有点酷!
  15. win7登录密码破解工具
  16. Android4.4 Input 输入上层分析
  17. 基于Android的手机邮件收发(JavaMail)之四(邮件的发送)
  18. 以机房B级建设标准满足等保2.0三级要求 | 混合云基础设施
  19. 点源时域麦克斯韦方程AI求解
  20. 群晖NAS中对Gitlab配置邮箱发送消息_以163邮箱为例

热门文章

  1. 如何定位cpu占用率高的java线程
  2. 对象的notify方法的含义和对象锁释放的三种情况
  3. Learn Python 011: while loop
  4. 斯隆-凯特琳癌症中心使用RTLS系统,改善患者术后护理流程
  5. Zeppelin:用于区块链应用的开源安全智能合约架构
  6. 如何将github上源代码导入eclipse中
  7. 点击空白 键盘消失 (待续……)
  8. 如何复制代码到剪贴板?JS/FLASH...
  9. asp and asp.net trips
  10. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)...