關閉頁面時執行“退出”的解決方案

在有些應用中我們需要實時的更新站點用戶是否在線的狀態。比如一些論壇里的在線成員實時顯示,或基于網頁的聊天、會議系統等。這種情況下,如果用戶點擊“退出”按鈕或鏈接,我們將之行一系列后臺操作,將該用戶標識成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.pswp.cn/news/379967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379967.shtml
英文地址,請注明出處:http://en.pswp.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…