2011年6月11日 星期六

Cookie 與 Session

最近要把一個ASP的網站改寫成ASP.NET,一段時間沒接觸,發現自己有些網頁的基本觀念還不是很清楚,希望現在複習一下還不太晚。

State、Stateless、Stateful
要了解Cookie和Session物件就不得不先提HTTP是Stateless的協定這點,因為這是,那State、Stateless、Stateful分別又是什麼意思?

“Stateless”在這裡直接翻譯成中文的話是「無狀態」,不說清楚的話還以為是張懸的歌每次Client端對Server發出的要求(Request)都是各自獨立的,前面的要求不會影響到後面的回應。用買東西當範例:先送出一個Request選定一個標錯價的螢幕,再送出一個Request要結帳,但是上一個選定的Request並不會被儲存,也就是說Server不會記得你剛剛做了什麼

所以State就是「目前的狀態」的意思,“Stateful”這個詞相應而生,意思是Client端與Server端之間的對話能夠記住現在在做什麼,也就是「充滿狀態的」。

Cookie?好吃嗎?
Cookie只是一個小小的文字檔,存在你的記憶體或硬碟空間裡(也就是Client端),通常會儲存一些對網站的個人喜好設定還有session的id,以前可能會拿來驗證是否登入但是隨著XSS攻擊的災情逐漸慘重大家也就開始注重Cookie的安全性,除了不要把重要的東西放進去之外把HttpOnly這個屬性設為true,這樣除了HTTP協定以外的東西就沒辦法存取這個Cookie了。
browser_show_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!");
}

image image

按下Submit再按Show就可以看到存在Session["age"]的資料,每個Session都會有個Session ID,Client端的瀏覽器拿著這個ID向Sever端相認,證明這個Session儲存的資料是屬於自己的。

image

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 工作階段狀態概觀

回目錄
回首頁

1 則留言 :

  1. aCookie.Expires = DateTime.Now.AddDays(1)
    請問這個是不是要改成 myCookie.Expires?

    回覆刪除

Related Posts Plugin for WordPress, Blogger...