關于重新登陸! 1:在Global中的設置。 //添加Init,并且添加AcquireRequestState事件; public void Init(HttpApplication application) { application.AcquireRequestState +=new EventHandler(application_AcquireRequestState); } //實現AcquireRequestState,在每次客戶端response的時候都會執行這個事件; private void application_AcquireRequestState(object sender, EventArgs e) { System.Web.HttpApplication App = ((HttpApplication)sender); if(App.Context.Session == null) return; if(App.Context.Session["userID"] == null ) return; System.Data.DataTable dt = (System.Data.DataTable)Application["userTable"]; if(dt.Select("userID = "+Session["userID"].ToString()).Length>0) { dt.Rows[0]["loginTime"] = System.DateTime.Now; dt.AcceptChanges(); } } //Timer的間隔時間 private int interval = 20; //在Application_Start中 1:建立在線全局用戶表; 2:注冊timer事件(用于間隔一定時間來維護在線用戶表)。 protected void Application_Start(Object sender, EventArgs e) { //--1 application user table; System.Data.DataTable dt = new DataTable(); dt.Columns.Add("userID"); dt.Columns.Add("loginTime"); dt.PrimaryKey = new System.Data.DataColumn[]{dt.Columns["userID"]}; dt.AcceptChanges(); Application.Lock(); Application["userTable"] = dt; Application.UnLock(); //--2 Timer System.Timers.Timer tm = new System.Timers.Timer(); tm.Interval = 60000*this.interval; tm.Elapsed +=new System.Timers.ElapsedEventHandler(tm_Elapsed); tm.Start(); } //timer事件; private void tm_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { deleteTimeOutUser(); } //刪除過期的在線用戶; private void deleteTimeOutUser() { if(Application["userTable"] == null) return; System.Data.DataTable dt = (System.Data.DataTable)Application["userTable"]; foreach(System.Data.DataRow dr in dt.Rows) { if(System.DateTime.Compare(((System.DateTime)dr["loginTime"]).AddMinutes(2),System.DateTime.Now)<0) dr.Delete(); } dt.AcceptChanges(); } //------------------------------用戶單擊退出后--的過程----------------------------------------- //退出 public void reLogin(System.Web.UI.Page currentPage) { if((currentPage.Session != null)&&(currentPage.Session["userID"] != null)) { this.deleteUser(int.Parse(currentPage.Session["userID"].ToString()),currentPage.Application); } currentPage.Session.Abandon(); } //刪除當前用戶在application中的userID; private void deleteUser(int userID,System.Web.HttpApplicationState Application) { if(Application["userTable"] == null) return; System.Data.DataTable dt = (System.Data.DataTable)Application["userTable"]; foreach(System.Data.DataRow dr in dt.Rows) { if(int.Parse(dr["userID"].ToString()) == userID) dr.Delete(); } dt.AcceptChanges(); } 在刪除在線用戶時如果程序使用了Form認證模式,還應該System.Web.Security.FormsAuthentication.Signout() ---------------------------------------------------------------------------- 遺留問題,雖然解決了超時注銷的問題,但用戶直接退出IE時如何向服務器發出 退出請求,刪除當前用戶ID;
|