一、原理 在.net中的global.asax中有Application_AuthenticateRequest事件和Application_BeginRequest事件是在每次訪問aspx文件都會觸發。但是Application_BeginRequest中不能對已經經過FROMS身份驗證的身份ticket票進行識別。所以只能放到Application_AuthenticateRequest中去。 我的實現原理是:每次訪問aspx文件時候都會判斷在線表里面是否有這個用戶(已經登錄了的記錄用戶名,沒有登錄的記錄IP地址),如果不存在,則將該用戶的身份、最后訪問時間、最后訪問IP、和最后訪問的URL存入數據庫。如果數據庫中已經曾在,則更新該記錄,把最后訪問時間,IP以及最后訪問URL更新。 同時,刪除數據庫中與當前時間間隔20分鐘以上的數據(20分鐘沒操作當為超時)。 二、優點 這樣,你不僅僅可以看到當前在線的準確人數,還知道是那些人在線,以及是否登陸,和訪問人數中已經是會員的比例,以及所在位置,并計算某個頁上的人數。 三、數據庫結構: 主鍵 字段 類型 長度 是否為空說明 1uson_serialint40序號 0uson_uservarchar200用戶名(沒登陸則為IP) 0uson_companyvarchar1000公司名(沒登陸則為'游客') 0uson_ip varchar200IP地址 0uson_datedatetime80最后操作時間 0uson_urlvarchar1000最后操作頁面路徑 四、程序 注意: 1、程序位于global.asax中 2、我是使用的FORMS身份驗證 3、請using System.Web.Security protected void Application_AuthenticateRequest(Object sender, EventArgs e) { string strUserID = string.Empty; string strCompany = string.Empty; if (Request.IsAuthenticated) { FormsIdentity identity = (FormsIdentity)User.Identity; FormsAuthenticationTicket ticket = identity.Ticket; strUserID = User.Identity.Name; strCompany = ticket.UserData.Split("|".ToCharArray())[2]; } else { strUserID = Request.UserHostAddress; strCompany = "游客"; } MemberOnlineInfo objOnline = new MemberOnlineInfo(strUserID, Request.UserHostAddress, DateTime.Now.ToString(), Request.FilePath, strCompany); MemberAccount account = new MemberAccount(); if (!account.CheckUserOnline(strUserID)) account.AddOnline(objOnline); else account.UpdateOnline(objOnline); //刪除超時的會員 account.DeleteOnline(); }
|