1.作用
Cookie是存在客戶端,Session是存在服務(wù)器端,目的是一樣的:保存和當(dāng)前客戶端相關(guān)的數(shù)據(jù)(當(dāng)前網(wǎng)站的任何一個(gè)頁面都能取到Session)。
在本篇博文的姊妹篇《Cookie詳解》中,黑兔在最后說了幾點(diǎn)Cookie的缺陷,簡單的說就是無法存儲重要數(shù)據(jù)。那么關(guān)乎重要數(shù)據(jù)的狀態(tài)如何存儲?Cookie妹妹Session講給你一個(gè)很好的答案。
2.醫(yī)生的賬本
需要一種“服務(wù)器端的Cookie”:醫(yī)生需要一個(gè)私人賬本,記錄病人編號和身份的對應(yīng)關(guān)系。由于身份證無法造假,所以能夠保證信息不被假冒。(身份證無法造假,這個(gè)身份證就可以唯一標(biāo)識這個(gè)用戶;)核心信息放到服務(wù)器上,客戶端無法去篡改。這就是Session的大體原理。
3.IRequiresSessionState
Cookie不能存儲機(jī)密數(shù)據(jù)。要使用ASP.Net已經(jīng)內(nèi)置的Session機(jī)制。普通的HttpHandler要能夠操作Session,要實(shí)現(xiàn)IRequiresSessionState接口,這個(gè)接口是沒有任何方法的“標(biāo)記接口”,因?yàn)閟ession處理會稍微降低系統(tǒng)性能,所以 HttpHandler 默認(rèn)不處理Session,asp.net引擎如果看到ashx實(shí)現(xiàn)了IRequiresSessionState,則幫咱們處理。
4.自毀裝置
Session有自動(dòng)銷毀機(jī)制,如果一段時(shí)間內(nèi)瀏覽器沒有和服務(wù)器發(fā)生任何的交互,則Session會定時(shí)銷毀。這也就是為什么一段時(shí)間不操作,系統(tǒng)就會自動(dòng)退出。
當(dāng)然Session也可以手動(dòng)設(shè)置銷毀,比如做安全退出的功能。就需要用到。 context.Session.Abandon();//銷毀Session
5.自毀倒計(jì)時(shí)
在web.config的system.web節(jié)點(diǎn)下配置sessionState節(jié)點(diǎn)的timeout,單位是分鐘,默認(rèn)是20(也只是一個(gè)建議,也許服務(wù)器10分鐘的時(shí)候就讓Session失效了)
1.Session中可以存放任意類型
1 //Cookie 的值是String2 //Session的值可以是幾乎任何類型3 context.Response.ContentType = "text/html";4 context.Session["test1"] = "HelloWorld";5 context.Session["test2"]=888;2.登錄案例
這個(gè)案例意圖在演示Session的使用,而絕對不是真的登錄,項(xiàng)目中這樣寫,肯定被打死。。。
1)Login頁面
1 //一個(gè)比較好的小習(xí)慣,吧Session的名字設(shè)置成一個(gè)常量字段, 2 //以后可以直接引用這個(gè)字段,防止寫錯(cuò)。 3 public const string LOGINUSERNAME = "LoginUserName"; 4 public void PRocessRequest(HttpContext context) 5 { 6 context.Response.ContentType = "text/html"; 7 string username = context.Request["username"]; 8 string passWord = context.Request["password"]; 9 if (password == "123")10 {11 context.Session[LOGINUSERNAME] = username;12 context.Response.Redirect("Main.ashx");13 }14 else15 {16 context.Response.Write("密碼錯(cuò)誤");17 }18 }2)需要登錄才能看到的頁面
1 public void ProcessRequest(HttpContext context) 2 { 3 context.Response.ContentType = "text/html"; 4 string username = (string)context.Session[Login1.LOGINUSERNAME]; 5 if (username == null) 6 { 7 context.Response.Redirect("login.html"); 8 } 9 else if (username == "admin")10 {11 context.Response.Write("哇,老大好!");12 }13 else14 {15 context.Response.Write("當(dāng)前登錄用戶名"+username+"沒有權(quán)限查看");16 }17 }
新聞熱點(diǎn)
疑難解答
圖片精選