Asp.net如何防止論壇使用者重複登入的方法?

來源:互聯網
上載者:User
本例完成的功能就是防止使用者重複登入!若使用者已經

登入,則當其再次登入時,彈出提示框後返回!

實現思路:使用者登入成功後,將使用者登入資訊存放到

Hashtable類型的Application["Online"]裡面,其鍵

值為SessionID,其Value值為使用者ID;當使用者登出時

,調用Session.Abandon;在Global.asax裡面的

SessionEnd事件中,將使用者ID從Hashtable中刪除;在

使用者訪問頁面時,察看Hashtable中是否有對應的使用者

ID如果沒有則判斷使用者不線上(使用者不線上的原因可

能是按了登出按鈕、網頁逾時等)

1、公用類中判斷使用者是否線上的函數(供使用者調用)
/// <summary>
/// 判斷使用者strUserID是否包含在Hashtable h中
/// </summary>
/// <param name="strUserID"></param>
/// <param name="h"></param>
/// <returns></returns>
public static bool AmIOnline(string

strUserID,Hashtable h)
{
if(strUserID == null)
return false;

//繼續判斷是否該使用者已經登陸
if(h == null)
return false;

//判斷雜湊表中是否有該使用者
IDictionaryEnumerator e1 = h.GetEnumerator();
bool flag = false;
while(e1.MoveNext())
{
if(e1.Value.ToString().CompareTo(strUserID) ==

0)
{
flag = true;
break;
}
}
return flag;
}

2、使用者登入事件處理:
private void btnlogin_Click(object sender,

System.Web.UI.ImageClickEventArgs e)
{ ////User為自訂的類,其中包含Login方法
User CurUser = new User();
CurUser.UserID = this.username.Text.Trim();

if(MyUtility.AmIOnline(CurUser.UserID,

(Hashtable)Application["Online"]))
{
JScript.Alert("您所使用的登入ID已經線上了!您不

能重複登入!");
return;
}

CurUser.LoginPsw =

FormsAuthentication.HashPasswordForStoringInCon

figFile(this.password.Text.Trim(),"SHA1");
int ii = CurUser.Login();
StringBuilder sbPmt = new StringBuilder();

switch(ii)
{
case 0: //如果登入成功,則將UserID加入

Application["Online"]中
Hashtable h = (Hashtable)Application["Online"];
if(h == null)
h = new Hashtable();
h[Session.SessionID] = CurUser.UserID;
Application["Online"] = h;

Session["UserID"] = CurUser.UserID;
Session["UserNM"] = CurUser.UserNM;
Session["RoleMap"] = CurUser.RoleMap;
Session["LoginPsw"] = CurUser.LoginPsw;
Session["LoginTime"] = DateTime.Now;
Response.Redirect("ChooseRole.aspx");
break;
case -1:
JScript.Alert("使用者名稱錯誤!");
break;
case -2:
JScript.Alert("密碼錯誤!");
break;
default:
sbPmt.Append("登入過程中發生未知錯誤!");
JScript.Alert(sbPmt.ToString());
break;
}
return;
}

3、在Global.asax中的Session_End事件:
protected void Session_End(Object sender,

EventArgs e)
{
Hashtable h=(Hashtable)Application["Online"];

if(h[Session.SessionID]!=null)
h.Remove(Session.SessionID);

Application["Online"]=h;
}

4、在每一個頁面需要重新整理的地方,調用如下代碼:
try
{
if(!common.MyUtility.AmIOnline(Session

["UserID"].ToString(),(Hashtable)Application

["OnLine"]))
{
//使用者沒有線上 ,轉到登入介面
Response.Write

("<script>parent.document.location.href='Login.

aspx';</script>"); ////有架構時用
//Response.Redirect("login.aspx"); ////無架構時


return;
}
}
catch
{
//會話到期 ,轉到登入介面
Response.Write

("<script>parent.document.location.href='Login.

aspx';</script>"); ////有架構時所用
//Response.Redirect("login.aspx"); ////無架構時


return;
}

深入思考:
由本例的解決方案可以加以延伸,比如,在儲存

UserID的時候,將UserID+用戶端IP地址一起存進去,

則在將相應資訊取出來分析的時候,可以做到:當用

戶在不同的電腦上先後登入的時候,則允許最近一

次的登入,而將之前的登入刪除!等等等等

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.