一、什么是Cookie?
Cookie是存儲在客戶端文件系統的文本文件或客戶端瀏覽器對話的內存中的少量數據。它主要用來跟蹤數據設置,例如:當我們要訪問一個網站網頁的時候,用戶請求網頁時,應用程序可能會首先檢查此用戶是否已經登錄該網站,我們此時可以通過Cookie獲取用戶信息,判斷是否讓該用戶繼續訪問該網站,比較典型的時一個電商網站的購物車采用Cookie來記錄當前用戶的購物情況。
二、Cookie的工作機制
具體來說cookie機制采用的是在客戶端保持狀態的方案。它是在用戶端的會話狀態的存貯機制,他需要用戶打開客戶端的cookie支持。cookie的作用就是為了解決HTTP協議無狀態的缺陷所作的努力。
正統的cookie分發是通過擴展HTTP協議來實現的,服務器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在后臺自動發送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍大于等于將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。
cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍。若不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在硬盤上而是保存在內存里,當然這種行為并不是規范規定的。若設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對于保存在內存里的cookie,不同的瀏覽器有不同的處理方式。
三、Cookie的具體用法
1、記錄Cookie
HttpCookie cookie=new HttpCookie("user");//創建一個名稱為user的cookie對象
cookie["username"]="xiaoming";//給cookie對象賦值
cookie["password"]="111111";//給cookie對象賦值
cookie.Expires=DateTime.Now.AddHours(2);//設定cookie有效期限 從當前開始2小時后過期
2、將Cookie添加到內部的Cookie集合。Cookie集合中所有的Cookie均通過Http輸出流在Set-Cookie頭中發送到客戶端。
Response.AppendCookie(Cookie);
3、讀取Cookie
HttpCookie cookie=Request["user"];
if(cookie!=null)
{
Response.Write("cookie不存在");
}
else
{
string username=cookie["username"];
string password=cookie["password"];
}
4、刪除Cookie
由于Cookie存在與客戶端的計算機中,無法直接將其刪除,但是可以采用讓瀏覽器來刪除客戶端的Cookie,讓其變為過期的Cookie,這時候瀏覽器
檢查的時候會刪除過期的Cookie。
cookie.Expires=DateTime.Now.AddHours(-1);
5、如何實現跨越讀取Cookie
默認情況下,Cookie與特定的域相關聯,不同域之間的Cookie是無法共享的,如果你的站點有子域(例如:demo.com、 a.demo.com、b.demo.com)
則可以把Cookie同特定的子域相關聯,實現共享Cookie
比如:
cookie.Domain="a.demo.com";
cookie.Domain="b.demo.com";
這樣Cookie就可以用于主域(demo.com)、a.demo.com、b.demo.com等多個子域了。
四、Cookie的優點和缺點
1.優點
1、可配置到期規則 Cookie 可以在瀏覽器會話結束時到期,或者可以在客戶端計算機上無限期存在,這取決于客戶端的到期規則。
2、不需要任何服務器資源 Cookie 存儲在客戶端并在發送后由服務器讀取。
3、簡單性 Cookie 是一種基于文本的輕量結構,包含簡單的鍵值對。
4、數據持久性 雖然客戶端計算機上 Cookie 的持續時間取決于客戶端上的 Cookie 過期處理和用戶干預,Cookie 通常是客戶端上持續時間最長的數據保留形式。
2.缺點
大小受到限制 大多數瀏覽器對 Cookie 的大小有 4096 字節的限制,盡管在當今新的瀏覽器和客戶端設備版本中,支持 8192 字節的 Cookie 大小已愈發常見。
用戶配置為禁用 有些用戶禁用了瀏覽器或客戶端設備接收 Cookie 的能力,因此限制了這一功能。潛在的安全風險 Cookie 可能會被篡改。用戶可能會操縱其計算機上的 Cookie,這意味著會對安全性造成潛在風險或者導致依賴于 Cookie 的應用程序失敗。另外,雖然 Cookie 只能被將它們發送到客戶端的域訪問,歷史上黑客已經發現從用戶計算機上的其他域訪問 Cookie 的方法。您可以手動加密和解密 Cookie,但這需要額外的編碼,并且因為加密和解密需要耗費一定的時間而影響應用程序的性能。
注意:Cookie 通常用于為已知用戶自定義內容的個性化情況。在大多數此類情況中,Cookie 是作為“標識”而不是“身份驗證”。因此,通常保護用于標識的 Cookie 的方法是在 Cookie 中存儲用戶名、帳戶名或唯一用戶 ID(例如 GUID),然后用以訪問站點的用戶個性化結構中的信息。
歡迎關注我的公眾號(同步更新文章):DoNet技術分享平臺
原文