转自
using System; using System.Collections.Generic; using System.Data; using System.Configuration; using System.Web; using System.Web.UI; using System.Collections;
namespace BNet.Web.Modulers { /** /// SingleLoginModuler 的摘要说明 /// public class SingleLoginModuler : System.Web.IHttpModule { const string sigle_login_userid = "evlon_siglelogin_userid"; const string sigle_pre_logout_sessionid = "evlon_sigle_pre_logout_sessionid";
public static StringLifeValueDictionary UsableGetter(ref StringLifeValueDictionary dic) { if (dic == null) { dic = new StringLifeValueDictionary(); } else { ListlistRemove = new List(); //StringLifeValueDictionary.Enumerator iter = dic.GetEnumerator(); IDictionaryEnumerator iter = dic.GetEnumerator(); while (iter.MoveNext()) { if (((LifeValue)iter.Entry.Value).life < DateTime.Now) { // listRemove.Add(iter.Current.Key); listRemove.Add((string)iter.Entry.Key);
} }
foreach (string key in listRemove) { dic.Remove(key); } }
return dic; }
static StringLifeValueDictionary loginedUserIdDictionary = null; static StringLifeValueDictionary LoginedUserIdDictionary { get { return UsableGetter(ref loginedUserIdDictionary); } }
static StringLifeValueDictionary preLogoutSessionIdDictionary = null; static StringLifeValueDictionary PreLogoutSessionIdDictionary { get { return UsableGetter(ref preLogoutSessionIdDictionary); } }
public SingleLoginModuler() { // // TODO: 在此处添加构造函数逻辑 // }
//IHttpModule 成员 #region IHttpModule 成员
public void Dispose() { }
public void Init(HttpApplication context) { context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute); context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);
}
void context_PreRequestHandlerExecute(object sender, EventArgs e) { HttpApplication context = sender as HttpApplication; IHttpHandler httpHandler = context.Context.CurrentHandler; ISingleLogin sl = httpHandler as ISingleLogin; if (sl != null) { string suid = sl.SigleUserLoginId; if (suid != string.Empty) { if (PreLogoutSessionIdDictionary.ContainsKey(context.Session.SessionID)) { //这个用户应该强制登出 PreLogoutSessionIdDictionary.Remove(context.Session.SessionID);
Page page = (Page)httpHandler; page.PreInit += new EventHandler(page_PreInit);
} else if (!LoginedUserIdDictionary.ContainsKey(suid)) { LoginedUserIdDictionary.Add(suid, new LifeValue(context.Session.SessionID)); } } }
}
void page_PreInit(object sender, EventArgs e) { Page page = sender as Page; ISingleLogin sl = page as ISingleLogin; if (sl != null) { sl.SigleUserLogout(); page.Response.End(); } }
void context_PostRequestHandlerExecute(object sender, EventArgs e) { //从LogineduserId 里找到和当前用户一样的用户ID的SessionId HttpApplication context = sender as HttpApplication; IHttpHandler httpHandler = context.Context.CurrentHandler; ISingleLogin sl = httpHandler as ISingleLogin; if (sl != null) { string suid = sl.SigleUserLoginId; if (suid != string.Empty) { if (LoginedUserIdDictionary.ContainsKey(suid)) { string sessionId = LoginedUserIdDictionary[suid].value; if (sessionId != context.Session.SessionID) { if (!PreLogoutSessionIdDictionary.ContainsKey(sessionId)) { PreLogoutSessionIdDictionary.Add(sessionId, new LifeValue(suid)); }
LoginedUserIdDictionary.Remove(suid); } } else { LoginedUserIdDictionary.Add(sl.SigleUserLoginId, new LifeValue(context.Session.SessionID)); }
} } }
#endregion }
public class LifeValue { public string value; public DateTime life;
public LifeValue(string value) { this.value = value; this.life = DateTime.Now.AddMinutes(HttpContext.Current.Session.Timeout + 5); } } //public class StringLifeValueDictionary : Dictionary //{
//}
public class StringLifeValueDictionary : System.Collections.DictionaryBase { public LifeValue this[string key] { get { return (LifeValue)this.Dictionary[key]; } set { this.Dictionary[key] = value; } }
public void Add(string key, LifeValue value) { this.Dictionary.Add(key, value); }
public bool Contains(string key) { return this.Dictionary.Contains(key); }
public void Remove(string key) { this.Dictionary.Remove(key); }
public bool ContainsKey(string key) { return this.Dictionary.Contains(key); }
public IDictionaryEnumerator GetEnumerator() { return this.Dictionary.GetEnumerator(); }
}
public interface ISingleLogin { string SigleUserLoginId { get; }
void SigleUserLogout();
} }
/// /// PageBaseNew 的摘要说明 /// public class PageBaseNew : System.Web.UI.Page, BNet.Web.Modulers.ISingleLogin { public PageBaseNew() { this.Load += new System.EventHandler(PageBaseNew_Load);
} public interface ISingleLogin { string SigleUserLoginId { get; }
void SigleUserLogout();
} private void PageBaseNew_Load(object sender, System.EventArgs e) { if (Session["userid"] == null) { Response.Write("");//考虑到框架问题 } }
/*我的扩展*/ public string BaseUrl { get { string strBaseUrl = ""; strBaseUrl += "http://" + HttpContext.Current.Request.Url.Host; if (HttpContext.Current.Request.Url.Port.ToString() != "80") { strBaseUrl += ":" + HttpContext.Current.Request.Url.Port.ToString(); } strBaseUrl += HttpContext.Current.Request.ApplicationPath; return strBaseUrl + "/"; } } public string SigleUserLoginId { get { if (Session["userid"] != null) { return Session["userid"].ToString(); } else return ""; } }
public void SigleUserLogout() { Session.Abandon(); Response.Write("你在别处已经登陆,强制退出本次登陆!"); }
}
转自:http://evlon.cnblogs.com/archive/2006/03/20/354191.html
但是我自己遇到一个问题:
就是repeaterURL分页的时候丢失SESSIONID
cookieless="true" 改成false
true-->表示存储到URL中
false-->表示存储到COOKIE中