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

在有些应用中我们需要实时的更新站点用户是否在线的状态。比如一些论坛里的在线成员实时显示,或基于网页的聊天、会议系统等。这种情况下,如果用户点击“退出”按钮或链接,我们将之行一系列后台操作,将该用户标识成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)
ExpandedBlockStart.gifContractedBlock.gif
{
     
//Call Server method;
}

 

 

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

 

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

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

 

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

 

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

 

3.非AJAX的方法

 

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

 

 

function Signout()
ExpandedBlockStart.gifContractedBlock.gif
{
    document.getElementById(
"Form1").action="Signout.aspx";
    document.getElementById(
"Form1").submit();
}
 

 

 

 

转载于:https://www.cnblogs.com/blodfox777/archive/2008/07/22/1248555.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java——多线程实现的三种方式

创建新执行线程有三种方法。 第一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。 例如&#xff0c;计算大于某一规定值的质数的线程可以写成&#xff1a; class PrimeThread extends Thread {long minPrime;Pri…

python网络编程---TCP客户端

0x01 环境 python2、 pycharm 0x02 程序 # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com tarfet_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 连接客户端 clien…

c#枚举数字转枚举_C#枚举能力问题和解答 套装4

c#枚举数字转枚举1) What is the correct output of given code snippets in C#.NET? using System;class program{enum emp_salary : int{emp1 10000,emp2 15000,emp4 20000}static void Main(string[] args){int sal (int)emp_salary.emp2;Console.WriteLine(sal);}}100…

Java——匿名内部类实现线程的两种方式

package com.yy.thread;public class Demo4_Thread {public static void main(String[] args) {demo1(); //匿名内部类&#xff0c;第一种&#xff0c;继承Threaddemo2(); //匿名内部类&#xff0c;第二种&#xff0c;实现Runnable接口 }private static void…

zlib1.2.5的编译

zlib1.2.5没有了1.2.4的vc6工程&#xff0c;只好使用命令行编译。通过win32/Makefile.msc发现有4种编译方式&#xff0c;如下&#xff1a;# Usage:# nmake -f win32/Makefile.msc (standard build)# nmake -f win32/Makefile.msc LOC-DFOO …

python网络编程--UDP客户端

0x01 环境 python、pycharm 0x02 程序 # -*- coding:utf-8 -*-import sockettarget_host127.0.0.1 target_part80#创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#发送一些数据 client.sendto(AAAAAA,(target_host,target_part))#接收到的消息 …

window.open参数和技巧

【1、最基本的弹出窗口代码】 <SCRIPT LANGUAGE"javascript"> <!-- window.open (page.html) --> </SCRIPT> 因为着是一段javascripts代码&#xff0c;所以它们应该放在<SCRIPT LANGUAGE"javascript">标签和</script>之间。…

java jar包示例_Java包getImplementationTitle()方法和示例

java jar包示例包类的getImplementationTitle()方法 (Package Class getImplementationTitle() method) getImplementationTitle() method is available in java.lang package. getImplementationTitle()方法在java.lang包中可用。 getImplementationTitle() method is used to…

Java——获取和设置多线程的名称

给名字进行赋值有两种方式&#xff1a; 1&#xff0c;通过构造去赋值 Thread(String name) 直接在构造方法里面传一个名字就行了2&#xff0c;通过set设置的方法进行赋值 package com.yy.threadmethod;public class Demo1_Name {public static void main(String[] args) {dem…

十三、oracle 数据字典和动态性能视图

一、概念数据字典是oracle数据库中最重要的组成部分&#xff0c;它提供了数据库的一些系统信息。动态性能视图记载了例程启动后的相关信息。 二、数据字典1)、数据字典记录了数据库的系统信息&#xff0c;它是只读表和视图的集合&#xff0c;数据字典的所有者为sys用户。2)、用…

python网络编程---TCP服务器

0x01 环境 python2 pycharm 0x02 程序 客户端程序&#xff1a; # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com target_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STRE…

C# 获取磁盘容量

/// 获取指定驱动器的空间总大小(单位为B) /// </summary> /// <param name"str_HardDiskName">只需输入代表驱动器的字母即可 </param> /// <returns> </returns> public static long GetHardDi…

Java——获取当前线程的对象(currentThread())(两种方式)

package com.yy.threadmethod;public class Demo2_CurrentThread { /*** public static Thread currentThread()返回对当前正在执行的线程对象的引用。 * 返回&#xff1a;当前执行的线程。返回的是一个Thread* 该方法主要是为了协助 实现通过Runnable接口来对线程进行设置…

HDU2501_多米诺骨牌

题目大意&#xff1a; 有一个大小是 2 x n 的网格&#xff0c;现在需要用2种规格的骨牌铺满&#xff0c;骨牌规格分别是 2 x 1 和 2 x 2&#xff0c;请计算一共有多少种铺设的方法。 解题思路&#xff1a; 找出递推公式&#xff1a; f[i] f[i-1] f[i-2] * 2; 代码&#xff1a…

java jar包示例_Java包getSpecificationVendor()方法和示例

java jar包示例包类的getSpecificationVendor()方法 (Package Class getSpecificationVendor() method) getSpecificationVendor() method is available in java.lang package. getSpecificationVendor()方法在java.lang包中可用。 getSpecificationVendor() method is used to…

sys.argv和getopt

0x01 sys.argv sys.argv用来读取命令行参数&#xff0c;保存程序的文件名和命令参数&#xff0c;读入的参数以列表保存 import sysprint sys.argv print type(sys.argv)可以看到&#xff0c;sys.argv把空格当成分隔符&#xff0c;空格两边的值当做sys.argv的一个元素&#xf…

[导入]《大话设计模式》重印公告

摘要: 《大话设计模式》12月中旬上市&#xff0c;至2008年1月底仅仅一个多月&#xff0c;5000册即销售一空&#xff0c;清华大学出版社已经开始重印&#xff0c;也就是说很快可以在二月底或三月初看到新印刷修正过大部分错误的《大话设计模式》。 阅读全文[新闻]《人民日报市场…

Java——线程的四种不同形式

一&#xff0c;休眠线程 public static void sleep(long millis) throws InterruptedException 在指定的毫秒数内让当前正在执行的线程休眠&#xff08;暂停执行&#xff09;&#xff0c;此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。…

hdu1053 Entropy hdu2527 Safe Or Unsafe

裸裸的哈弗曼编码&#xff0c;求出哈弗曼编码的路径长度&#xff0c;注意整个字符串为一种字符的情况 View Code #include<iostream>#include<queue>#include<algorithm>#include<vector>using namespace std;struct node{int u,w; node(int a0,in…

Java ListResourceBundle getContents()方法与示例

ListResourceBundle类的getContents()方法 (ListResourceBundle Class getContents() method) getContents() method is available in java.util package. getContents()方法在java.util包中可用。 getContents() method is used to get the contents into the form of an Obje…