关于重新登陆! 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; //文中部分摘录于csdn网站 
|