转自
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{ /** <summary> /// SingleLoginModuler 的摘要说明 /// </summary> 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 { List<string> listRemove = new List<string>(); //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<string, LifeValue> //{
//}
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();
}}
<system.web>
<httpModules> <add name="SingleLogin" type="BNet.Web.Modulers.SingleLoginModuler"/> </httpModules> </system.web>
/// <summary>/// PageBaseNew 的摘要说明/// </summary>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("<script language = javascript>window.parent.opener=null;window.open('" + BaseUrl + "Login.aspx','_top')</script>");//考虑到框架问题 } }
/*我的扩展*/ 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
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="true" timeout="30"/>
cookieless="true" 改成false
true-->表示存储到URL中
false-->表示存储到COOKIE中
厦门德仔 认证博客专家 项目实施 软件开发 数据分析 毕业于南昌大学,拥有超过13年的工作经验,数据库工程师(中级),ERP认证工程师,FRCA报表工程师,PMP专业项目管理,具有项目管理能力,拥有多年项目实施与运维,精通SQL数据库,Asp.net和数据分析管理和开发。曾在台企,港企,美企,民企实施过多个完整ERP,WMS,EHR,OA,BI等项目。
