利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆
生活随笔
收集整理的這篇文章主要介紹了
利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*http://evlon.cnblogs.com/archive/2006/03/20/354191.html
*/
我在們使用ASP.Net開發WEB網站時,有的時候是不讓同一個用戶名在同一時間進行多次登陸的。
????? 為了不影響原來的整個網站,我選擇使用了HttpModuler來實現。
????? 先讓所有的Page從自己的Page類:BasePage類繼承,并實現 ISigleLogin接口。相關代碼如下:
????public?interface?ISingleLogin
????{
????????string?SigleUserLoginId?{?get;?}
????????void?SigleUserLogout();
????}
public?class?BasePage?:?System.Web.UI.Page?,?BNet.Web.Modulers.ISingleLogin
{
????public?BasePage()
????{
????????//
????????//?TODO:?在此處添加構造函數邏輯
????????//
????}
????protected?override?void?OnLoad(EventArgs?e)
????{
????????base.OnLoad(e);
????????if?(Session["UserId"]?==?null)
????????{
????????????Response.Write("你還沒有登陸");
????????????Response.Redirect("login.aspx");
????????}
????}
????ISingleLogin?成員#region?ISingleLogin?成員
????public?string?SigleUserLoginId
????{
????????get?
????????{
????????????if?(Session["UserId"]?!=?null)
????????????{
????????????????return?Session["UserId"].ToString();
????????????}
????????????else
????????????????return?"";
????????}
????}
????public?void?SigleUserLogout()
????{
????????Session.Abandon();
????????Response.Write("你在別處已經登陸,強制退出本次登陸!");
????}
????#endregion
}
????<httpModules>
??????<add?name="SingleLogin"?type="BNet.Web.Modulers.SingleLoginModuler"/>
????</httpModules>
</system.web>
????? 相關的SigleLoginModuler代碼如下:
using?System;
using?System.Collections.Generic;
using?System.Data;
using?System.Configuration;
using?System.Web;
using?System.Web.UI;
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";
????????static?StringLifeValueDictionary?loginedUserIdDictionary?=?null;
????????static?StringLifeValueDictionary?LoginedUserIdDictionary
????????{
????????????get
????????????{
????????????????if?(loginedUserIdDictionary?==?null)
????????????????{
????????????????????loginedUserIdDictionary?=?new?StringLifeValueDictionary();
????????????????}
????????????????else
????????????????{
????????????????????List<string>?listRemove?=?new?List<string>();
????????????????????StringLifeValueDictionary.Enumerator?iter?=?loginedUserIdDictionary.GetEnumerator();
????????????????????while?(iter.MoveNext())
????????????????????{
????????????????????????if?(iter.Current.Value.life?<?DateTime.Now)
????????????????????????{
????????????????????????????listRemove.Add(iter.Current.Key);
????????????????????????}
????????????????????}
????????????????????foreach?(string?key?in?listRemove)
????????????????????{
????????????????????????loginedUserIdDictionary.Remove(key);
????????????????????}
????????????????}
????????????????return?loginedUserIdDictionary;
????????????}
????????}
????????static?StringLifeValueDictionary?preLogoutSessionIdDictionary?=?null;
????????static?StringLifeValueDictionary?PreLogoutSessionIdDictionary
????????{
????????????get
????????????{
????????????????if?(preLogoutSessionIdDictionary?==?null)
????????????????{
????????????????????preLogoutSessionIdDictionary?=?new?StringLifeValueDictionary();
????????????????}
????????????????else
????????????????{
????????????????????List<string>?listRemove?=?new?List<string>();
????????????????????StringLifeValueDictionary.Enumerator?iter?=?preLogoutSessionIdDictionary.GetEnumerator();
????????????????????while?(iter.MoveNext())
????????????????????{
????????????????????????if?(iter.Current.Value.life?<?DateTime.Now)
????????????????????????{
????????????????????????????listRemove.Add(iter.Current.Key);
????????????????????????}
????????????????????}
????????????????????foreach?(string?key?in?listRemove)
????????????????????{
????????????????????????preLogoutSessionIdDictionary.Remove(key);
????????????????????}
????????????????}
????????????????return?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;
????????????if?(httpHandler?is?ISingleLogin)
????????????{
????????????????ISingleLogin?sl?=?httpHandler?as?ISingleLogin;
????????????????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;
????????????if?(httpHandler?is?ISingleLogin)
????????????{
????????????????ISingleLogin?sl?=?httpHandler?as?ISingleLogin;
????????????????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?interface?ISingleLogin
????{
????????string?SigleUserLoginId?{?get;?}
????????void?SigleUserLogout();
????}
}
*/
我在們使用ASP.Net開發WEB網站時,有的時候是不讓同一個用戶名在同一時間進行多次登陸的。
????? 為了不影響原來的整個網站,我選擇使用了HttpModuler來實現。
????? 先讓所有的Page從自己的Page類:BasePage類繼承,并實現 ISigleLogin接口。相關代碼如下:
????public?interface?ISingleLogin
????{
????????string?SigleUserLoginId?{?get;?}
????????void?SigleUserLogout();
????}
public?class?BasePage?:?System.Web.UI.Page?,?BNet.Web.Modulers.ISingleLogin
{
????public?BasePage()
????{
????????//
????????//?TODO:?在此處添加構造函數邏輯
????????//
????}
????protected?override?void?OnLoad(EventArgs?e)
????{
????????base.OnLoad(e);
????????if?(Session["UserId"]?==?null)
????????{
????????????Response.Write("你還沒有登陸");
????????????Response.Redirect("login.aspx");
????????}
????}
????ISingleLogin?成員#region?ISingleLogin?成員
????public?string?SigleUserLoginId
????{
????????get?
????????{
????????????if?(Session["UserId"]?!=?null)
????????????{
????????????????return?Session["UserId"].ToString();
????????????}
????????????else
????????????????return?"";
????????}
????}
????public?void?SigleUserLogout()
????{
????????Session.Abandon();
????????Response.Write("你在別處已經登陸,強制退出本次登陸!");
????}
????#endregion
}
????? 然后在Web.config中加入HttpModuler:
<system.web>????<httpModules>
??????<add?name="SingleLogin"?type="BNet.Web.Modulers.SingleLoginModuler"/>
????</httpModules>
</system.web>
????? 相關的SigleLoginModuler代碼如下:
using?System;
using?System.Collections.Generic;
using?System.Data;
using?System.Configuration;
using?System.Web;
using?System.Web.UI;
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";
????????static?StringLifeValueDictionary?loginedUserIdDictionary?=?null;
????????static?StringLifeValueDictionary?LoginedUserIdDictionary
????????{
????????????get
????????????{
????????????????if?(loginedUserIdDictionary?==?null)
????????????????{
????????????????????loginedUserIdDictionary?=?new?StringLifeValueDictionary();
????????????????}
????????????????else
????????????????{
????????????????????List<string>?listRemove?=?new?List<string>();
????????????????????StringLifeValueDictionary.Enumerator?iter?=?loginedUserIdDictionary.GetEnumerator();
????????????????????while?(iter.MoveNext())
????????????????????{
????????????????????????if?(iter.Current.Value.life?<?DateTime.Now)
????????????????????????{
????????????????????????????listRemove.Add(iter.Current.Key);
????????????????????????}
????????????????????}
????????????????????foreach?(string?key?in?listRemove)
????????????????????{
????????????????????????loginedUserIdDictionary.Remove(key);
????????????????????}
????????????????}
????????????????return?loginedUserIdDictionary;
????????????}
????????}
????????static?StringLifeValueDictionary?preLogoutSessionIdDictionary?=?null;
????????static?StringLifeValueDictionary?PreLogoutSessionIdDictionary
????????{
????????????get
????????????{
????????????????if?(preLogoutSessionIdDictionary?==?null)
????????????????{
????????????????????preLogoutSessionIdDictionary?=?new?StringLifeValueDictionary();
????????????????}
????????????????else
????????????????{
????????????????????List<string>?listRemove?=?new?List<string>();
????????????????????StringLifeValueDictionary.Enumerator?iter?=?preLogoutSessionIdDictionary.GetEnumerator();
????????????????????while?(iter.MoveNext())
????????????????????{
????????????????????????if?(iter.Current.Value.life?<?DateTime.Now)
????????????????????????{
????????????????????????????listRemove.Add(iter.Current.Key);
????????????????????????}
????????????????????}
????????????????????foreach?(string?key?in?listRemove)
????????????????????{
????????????????????????preLogoutSessionIdDictionary.Remove(key);
????????????????????}
????????????????}
????????????????return?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;
????????????if?(httpHandler?is?ISingleLogin)
????????????{
????????????????ISingleLogin?sl?=?httpHandler?as?ISingleLogin;
????????????????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;
????????????if?(httpHandler?is?ISingleLogin)
????????????{
????????????????ISingleLogin?sl?=?httpHandler?as?ISingleLogin;
????????????????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?interface?ISingleLogin
????{
????????string?SigleUserLoginId?{?get;?}
????????void?SigleUserLogout();
????}
}
轉載于:https://www.cnblogs.com/ghd258/archive/2006/03/21/354569.html
總結
以上是生活随笔為你收集整理的利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 编码规范和编程好习惯
- 下一篇: 单件模式