1. 程式人生 > >別入坑!Session和Cookie的區別

別入坑!Session和Cookie的區別

1.Cookie

什麼是Cookie呢?因為Http是一種無狀態協議,所以假設使用者往自己的購物車裡放了一件商品,當在在準備放一件時,這時伺服器已經無法判斷這個行為是屬於哪個使用者。為了解決這個問題,給每個訪問伺服器的使用者頒發一個通行證,每個通行證都不一樣,這樣伺服器就可以辨別了。這個通行證就是Cookie。Cookie實際上一小段文字資訊。

Cookie的主要內容包括名字、值、過期時間、路徑、域,路徑和域一起劃分了cookie的作用範圍。

1)Name 和 Value 屬性由程式設定,預設值都是空引用。

2)Domain屬性的預設值為當前URL的域名部分,不管發出這個cookie的頁面在哪個目錄下的。

3)Path屬性的預設值是根目錄,即 ”/” ,不管發出這個cookie的頁面在哪個目錄下的。可以由程式設定為一定的路徑來進一步限制此cookie的作用範圍。

4)Expires 屬性,這個屬性設定此Cookie 的過期日期和時間。

HttpCookie cookie = new HttpCookie("CookName");//初使化並設定Cookie的名稱
DateTime dt = DateTime.Now;
TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0);//過期時間為1分鐘
cookie.Expires = dt.Add(ts);//設定過期時間
cookie.Values.Add("userid", "value");
cookie.Values.Add("userid2", "value2");
Response.AppendCookie(cookie);

#Cookie可以分為會話cookie和持久化cookie,兩者的區別就是有沒有設定過期時間。

#Cookie具有不可跨域性,For example:你訪問新浪體育的網頁請求是不會帶有訪問虎撲體育的Cookie的。

2.Session

Session是和cookie不同的另一種記錄使用者狀態的機制。session是儲存在伺服器中,當客戶端瀏覽器訪問伺服器時,伺服器會將客戶端的資訊以某種方式儲存在伺服器上,這就是session。當客戶端再次訪問從伺服器中的session中拿取該客戶的狀態就行了。

那麼問題是:所有的客戶端瀏覽器訪問過來都是從伺服器中的session中取相應的客戶狀態,伺服器怎麼知道誰是誰?SeesionID,儲存在cookie中的該玩意兒,每次客戶端訪問的時候都會攜帶,然後在伺服器中找尋對應的客戶狀態,完美解決了以上問題。

#Session共享的問題:對於多網站(一父網站多子網站)的單一伺服器,就是出現各個子網站訪問的是同一個父網站,也就是會有多個會話,這樣sessionID就無法共享了。解決辦法就是:設定Cookie的域名為父域名,達到cookie共享,從而實現sessionID共享。弊端就是子網站的cookie資訊也共享了。

###last but not least:

1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。

2、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。

3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用cookie。

4、單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。

5、可以考慮將登陸資訊等重要資訊存放為session,其他資訊如果需要保留,可以放在cookie中。