• ASP.Net
  • import_contacts ASP.NET Cookie 概觀
    151
適用範圍

Cookie 是在 Web 伺服器和瀏覽器之間,伴隨要求和網頁傳送的一小段文字。Cookie 包含 Web 應用程式能夠在使用者造訪網站時讀取的資訊。

實用性:
重要性:

Cookie

背景

Cookie 是在 Web 伺服器和瀏覽器之間,伴隨要求和網頁傳送的一小段文字。Cookie 包含 Web 應用程式能夠在使用者造訪網站時讀取的資訊。

例如,如果使用者要求網站的網頁,應用程式除了傳送網頁以外,也會傳送包含日期和時間的 Cookie。當使用者的瀏覽器取得網頁時,瀏覽器也會取得儲存在使用者硬碟資料夾中的 Cookie。 如果使用者稍後再次要求網站的網頁,當使用者輸入 URL 時,瀏覽器會在硬碟中尋找與 URL 關聯的 Cookie。

如果 Cookie 存在,瀏覽器會將 Cookie 跟網頁要求一起傳送到您的網站。然後您的應用程式可以判斷使用者上次造訪網站的日期和時間。您可以使用這項資訊對使用者顯示訊息或檢查過期日。

Cookie 是與網站而不是特定網頁有關聯,因此不論使用者從網站要求的網頁為何,瀏覽器和伺服器都會交換 Cookie 資訊。當使用者造訪不同的網站時,每個網站也會將 Cookie 傳送至使用者的瀏覽器。瀏覽器會分開儲存所有的 Cookie。

Cookie 協助網站儲存造訪者的資訊。更明白的說法是,Cookie 是維護 Web 應用程式連續性的一種方法。換句話說,就是執行狀態管理的一種方法。除了實際交換資訊的短暫時間以外,瀏覽器和 Web 伺服器是中斷連接的。使用者對 Web 伺服器做出的每個要求,都會被視為獨立於任何其他要求。然而在許多情況下,如果當使用者要求網頁時,Web 伺服器能夠辨認使用者是很有用的。例如,購物網站的 Web 伺服器會持續追蹤個別購物者,因此網站能夠管理購物車和其他使用者特定資訊。因此 Cookie 的角色就像是一種名片,呈現相關的識別以協助應用程式了解如何繼續。

Cookie 有許多用途,都與協助網站記住使用者相關。例如,舉行投票的網站會簡單地使用布林值的 Cookie 資料,表示使用者的瀏覽器是否已經參加投票,讓使用者無法投票兩次。要求使用者登入的網站會使用 Cookie 記錄使用者已經登入,讓使用者不需要一直輸入認證。

Cookie 限制

大部分瀏覽器支援最多 4096 位元組的 Cookie。因為這項容量大小限制,所以 Cookie 最好用來儲存少量的資料,或最好儲存像是使用者 ID 的識別項。使用者 ID 可以用來識別使用者,然後從資料庫或其他資料存放區讀取使用者資訊 (請參閱以下的「Cookie 和安全性」一節以獲得儲存使用者資訊的安全性隱含資訊)。

瀏覽器也會強制限制在使用者電腦上能夠儲存的網站 Cookie 數量。大部分的瀏覽器只允許每個網站儲存 20 個 Cookie。如果您嘗試儲存更多,就會捨棄最舊的 Cookie。某些瀏覽器也會有接受來自所有網站 Cookie 數量的絕對限制,通常是 300。

您會遇到的 Cookie 限制是使用者能夠設定瀏覽器拒絕 Cookie。如果您定義 P3P 隱私權原則並將其置於網站的根目錄,更多瀏覽器就會接受網站的 Cookie。然而,您應盡可能避免完全依賴 Cookie 所有資訊,而是使用不同的機制儲存使用者特定資訊。儲存使用者資訊的一般方法是工作階段狀態,但是工作階段狀態是依照 Cookie 而定,在稍後的<Cookie 和工作階段狀態>一節中會說明。

寫入 Cookie 的方法

C#範例
Response.Cookies["userName"].Value = "patrick";
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);

HttpCookie aCookie = new HttpCookie("lastVisit");
aCookie.Value = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);
Response.Cookies["userInfo"]["userName"] = "patrick";
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);

HttpCookie aCookie = new HttpCookie("userInfo");
aCookie.Values["userName"] = "patrick";
aCookie.Values["lastVisit"] = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);

讀取 Cookie

C#範例
if(Request.Cookies["userInfo"] != null)
{
    Label1.Text = 
        Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);

    Label2.Text =
        Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);
}