一、原理在.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();
}