State、Stateless、Stateful
要了解Cookie和Session物件就不得不先提HTTP是Stateless的協定這點,因為這是,那State、Stateless、Stateful分別又是什麼意思?
“Stateless”在這裡直接翻譯成中文的話是「無狀態」,
所以State就是「目前的狀態」的意思,“Stateful”這個詞相應而生,意思是Client端與Server端之間的對話能夠記住現在在做什麼,也就是「充滿狀態的」。
Cookie?好吃嗎?
Cookie只是一個小小的文字檔,存在你的記憶體或硬碟空間裡(也就是Client端),通常會儲存一些對網站的個人喜好設定還有session的id,以前可能會拿來驗證是否登入但是隨著XSS攻擊的災情逐漸慘重大家也就開始注重Cookie的安全性,除了不要把重要的東西放進去之外把HttpOnly這個屬性設為true,這樣除了HTTP協定以外的東西就沒辦法存取這個Cookie了。
(網址列打javascript:alert(document.cookie),用javascript顯示出目前頁面的Cookie)
下面的C#語法示範了如何產生一個Cookie
HttpCookie myCookie = new HttpCookie("WhenItWasMade"); DateTime now = DateTime.Now; myCookie.Value = now.ToString(); aCookie.Expires = DateTime.Now.AddDays(1) myCookie.HttpOnly = true; Response.Cookies.Add(myCookie);
expires是過期的意思,所以這是個一天之後就會過期的Cookie。如果不設定的話,在關掉瀏覽器的時候Cookie就會被清除。
HttpOnyly屬性設為true之後在網址列打javascript:alert(document.cookie)
就顯示不出任何東西了。
Seesion,Sever端的物件
畢竟Cookie是儲存在Client端,難免會有安全性的問題,所以一些比較重要的資料就會選擇使用Session,比如說是否登入的驗證。比較特別的是Session是跟著瀏覽器產生的,所以當關掉瀏覽器或是過了20分鐘之後(也可以設定久一點)就會被拋棄。下面有個簡單的例子:
protected void Submit_Click(object sender, EventArgs e) { Session["age"] = AgeTextBox.Text; Session.Timeout = 1; } protected void ShowButton_Click(object sender, EventArgs e) { if (Session["age"] != null) { Response.Write("You are " + Session["age"] + " years old<br/>"); Response.Write("Session ID: " + Session.SessionID.ToString() + "<br/>"); Response.Write("Time out: "+ Session.Timeout.ToString()+"<br/>"); } else Response.Write("Session not exist!"); }
按下Submit再按Show就可以看到存在Session["age"]的資料,每個Session都會有個Session ID,Client端的瀏覽器拿著這個ID向Sever端相認,證明這個Session儲存的資料是屬於自己的。
Session.Timeout則是以分鐘為單位設定Session的生命週期,在這裡設為一分鐘,一分鐘後再按下Show就會發現剛剛存進去的Session已經不見了。
Time out也可以從Web.config裡設定:
<sessionState timeout="42" />
這樣只要不特別設定Time outr就是42分鐘。
參考資料:
[ASP.NET]Stateful與Stateless
[MSDN]ASP.NET Cookie 概觀
[MSDN]ASP.NET 工作階段狀態概觀
回目錄
回首頁
aCookie.Expires = DateTime.Now.AddDays(1)
回覆刪除請問這個是不是要改成 myCookie.Expires?