關於asp.net后台登陸只能從login.aspx進入的方法


方法一:

本例完成的功能就是防止用戶重復登錄!若用戶已經登錄,則當其再次登錄時,彈出提示框后返回!

實現思路:用戶登錄成功后,將用戶登錄信息存放到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地址一起存進去,則在將相應信息取出來分析的時候,可以做到:當用戶在不同的計算機上先后登錄的時候,則允許最近一次的登錄,而將之前的登錄刪除!等等等等

方法二:

 

對於后台一些需要登錄才能訪問的頁面,你是不是每次都去判斷一下登錄時保存在session或者cookie里面的值是否存在啊!

 

 

對於后台一些需要登錄才能訪問的頁面,你是不是每次都去判斷一下登錄時保存在session或者cookie里面的值是否存在啊!假如后台有幾十個這樣的 頁面,那么每次都得判斷,真心的感到煩,在這里我分享一下我知道的一個解決這個問題的方法吧!呵呵、、、大牛莫笑,只是想讓初學者學習一下學習.NET的 童鞋應該都知道吧,我們建的一個Demo.aspx頁面都是繼承於Page類,如下圖:

為了達到我們需要的結果,那好,現在我們來新建一個CheckLoginedPage類 : 
     

           


現在,讓我們的 CheckLoginedPage 類繼承於Page類:如圖:

接下來,就需要在CheckLoginedPage類中下手了,其代碼為:

復制代碼 代碼如下:

 


public class CheckLoginedPage : System.Web.UI.Page
{

public CheckLoginedPage()
{
Load += CheckLogin;//構造函數中加載CheckLogin方法
}

/// <summary>
/// 判斷是否登錄
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void CheckLogin(object sender, EventArgs e)
{
if (Session["XXXX"] == null)//登錄時保存在Session的值
{
Response.Redirect("**.aspx");//如果為空,轉到要調轉的頁面
}
}

}


呵呵、、、完成了上面幾步,現在你只需要讓必須登錄才能訪問到的頁面都繼承於CheckLoginedPage類就行了:

好了,就這么多了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM