程序員看淘寶,如何用Session保存用戶狀態(tài)
網(wǎng)上購物已經(jīng)成為現(xiàn)在生活不可缺少的一部分。我們上淘寶只是為了消費(fèi),今天換一個(gè)角度,用程序員的眼光看看淘寶。
如上圖:
情況一:當(dāng)打開一些和賬戶有關(guān)的網(wǎng)頁,檢測用戶沒有登錄,系統(tǒng)自動(dòng)會(huì)跳轉(zhuǎn)到登錄界面。
情況二:當(dāng)檢測到已經(jīng)有用戶登錄,頁面會(huì)自動(dòng)跳轉(zhuǎn)到目的頁面。
問題:系統(tǒng)如何檢測用戶是否登錄,如何保存用戶的登錄狀態(tài)?
下面說說自己的理解:利用Session保存用戶狀態(tài),
解決方案一:每個(gè)用戶都有一個(gè)Session對(duì)象相對(duì)應(yīng),當(dāng)用戶想要跳轉(zhuǎn)到任意跟賬戶有關(guān)的界面(已買到的寶貝頁面),每個(gè)頁面加載的時(shí)候都要判斷Session對(duì)象保存的用戶狀態(tài)。
1. 登錄界面的代碼:
- public partial class Login : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
- {
- Session["UserFlag"] = false;//首先設(shè)置會(huì)話值UserFlage表示用戶是否登錄
- if (UserVolidate(Login1.UserName, Login1.Password) == true)//調(diào)用自定義方法,驗(yàn)證用戶是否登錄成功
- {
- Session["UserFlag"] = true; //登錄成功
- e.Authenticated = true;
- Response.Redirect("Main.aspx"); //跳轉(zhuǎn)主界面
- }
- else{
- Response.Write("未登錄"); //否則提示未登錄
- }
- }
- /// <summary>
- /// 用戶登錄驗(yàn)證
- /// </summary>
- /// <param name="userName">用戶名</param>
- /// <param name="userPassword">用戶密碼</param>
- /// <returns>bool</returns>
- private bool UserVolidate(String userName, String userPassword)
- {
- //連接數(shù)據(jù)庫
- SqlConnection con = new SqlConnection("server=.;database=User;uid=sa;pwd=123456;");
- con.Open();
- SqlCommand cmd=new SqlCommand ("select * from UserInfo where UserName="+userName +" and Password="+userPassword );
- int num=cmd.ExecuteNonQuery ();
- if (num>0)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- }
2. 跳轉(zhuǎn)界面的代碼:(防止用戶通過URL直接跳轉(zhuǎn)到該界面,每次界面都要進(jìn)行判斷)
- public partial class Main : System.Web.UI.Page
- {
- //窗體加載
- protected void Page_Load(object sender, EventArgs e)
- {
- //根據(jù)Session對(duì)象保存的用戶登陸狀態(tài)判斷用戶是否登錄
- if (Session["UserFlag"].ToString () == "false")
- {
- //如果未登錄,則直接跳轉(zhuǎn)到登錄界面
- Response.Redirect ("Login.aspx");
- }
- }
- }
解決方案二:通過提供一個(gè)中介judge.aspx界面,每個(gè)跟賬戶有關(guān)的界面跳轉(zhuǎn)之前都跳轉(zhuǎn)到該界面,通過該界面加載的時(shí)判斷用戶的登錄狀態(tài)。
1. 登錄頁面代碼不變
2. judge.aspx頁面代碼:
- public partial class judge : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- //對(duì)Session對(duì)象進(jìn)行判斷用戶的狀態(tài)
- if (Session["flag"].ToString()=="false")
- {
- Response.Write("未登錄");
- }
- /*else
- {
- Response.Redirect("Main.aspx");//加上這句話會(huì)造成死循環(huán)
- }*/
- }
- }
3. 跳轉(zhuǎn)界面代碼:
- public partial class Main : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- //跳轉(zhuǎn)頁面必須經(jīng)過判斷,防止直接登錄該頁面,而不進(jìn)行登錄。
- Server.Execute("judge.aspx");//通過執(zhí)行Server對(duì)象的Execute方法
- }
- }
總結(jié):兩種解決方案原理相同,通過Session對(duì)象保存用戶狀態(tài),不同頁面都可以通過訪問該用戶的Session對(duì)象的會(huì)話值來判斷該用戶的狀態(tài)。解決方案二只是簡化了判斷過程,通過Server對(duì)象的Execute方法先執(zhí)行中介判斷界面,然后回歸到原程序執(zhí)行順序。
補(bǔ)充:
Server對(duì)象
語法:Server.Execute(path)
用途:這個(gè)方法是 IIS5.0 新增的功能,用途類似程序語言中的函數(shù)調(diào)用,也就是說,您可以在 ASP 程序中使用 Server.Execute(path)方法調(diào)用 Path 指定的 ASP 程序,待被調(diào)用的程序執(zhí)行完畢之后再返回原來的程序,繼續(xù)執(zhí)行接下來的指令。
Session對(duì)象
在網(wǎng)站中,每個(gè)新訪問的用戶都將產(chǎn)生自己的session(回話)對(duì)象。這個(gè)session對(duì)象在服務(wù)器端進(jìn)行管理,只能為當(dāng)前訪問的用戶服務(wù)。如果另一個(gè)用戶進(jìn)入網(wǎng)站,也將擁有自己的session對(duì)象,兩個(gè)用戶的session對(duì)象即使同名,也不能共享。
原文鏈接:http://blog.csdn.net/yinjingjing198808/article/details/7832769
【編輯推薦】