日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆

發(fā)布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/*http://evlon.cnblogs.com/archive/2006/03/20/354191.html
*/


我在們使用ASP.Net開發(fā)WEB網(wǎng)站時,有的時候是不讓同一個用戶名在同一時間進(jìn)行多次登陸的。
????? 為了不影響原來的整個網(wǎng)站,我選擇使用了HttpModuler來實現(xiàn)。

????? 先讓所有的Page從自己的Page類:BasePage類繼承,并實現(xiàn) ISigleLogin接口。相關(guān)代碼如下:

????public?interface?ISingleLogin
????
{
????????
string?SigleUserLoginId?{?get;?}

????????
void?SigleUserLogout();

????}

public?class?BasePage?:?System.Web.UI.Page?,?BNet.Web.Modulers.ISingleLogin
{
????
public?BasePage()
????
{
????????
//
????????
//?TODO:?在此處添加構(gòu)造函數(shù)邏輯
????????
//
????}


????
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(
"你在別處已經(jīng)登陸,強(qiáng)制退出本次登陸!");
????}


????
#endregion

}

????? 然后在Web.config中加入HttpModuler:

<system.web>
????
<httpModules>
??????
<add?name="SingleLogin"?type="BNet.Web.Modulers.SingleLoginModuler"/>

????
</httpModules>
</system.web>
????? 相關(guān)的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:?在此處添加構(gòu)造函數(shù)邏輯
????????????
//
????????}


????????
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))
????????????????????
{
????????????????????????
//這個用戶應(yīng)該強(qiáng)制登出
????????????????????????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?里找到和當(dāng)前用戶一樣的用戶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();

????}

}

轉(zhuǎn)載于:https://www.cnblogs.com/ghd258/archive/2006/03/21/354569.html

總結(jié)

以上是生活随笔為你收集整理的利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。