程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> ASP.NET中Cookie編程的基礎知識(2)

ASP.NET中Cookie編程的基礎知識(2)

編輯:關於.NET
  在開始討論 Cookie 的技術細節之前,我想先介紹一下 CookIE 應用的幾條限制。大多數浏覽器支持最多可達 4096 字節的 Cookie,如果要將為數不多的幾個值保存到用戶計算機上,這一空間已經足夠大,但您不能用一個 Cookie 來保存數據集或其他大量數據。在實際應用中,您可能並不希望在 CookIE 中保存大量的用戶信息,而只希望保存用戶編號或其他標識符。之後,當用戶再次訪問您的站點時,您就可以使用該用戶 ID 在數據庫中查找用戶的詳細信息。(有關保存用戶信息的說明,請參閱 CookIE 和安全性。)

  浏覽器還限制了您的站點可以在用戶計算機上保存的 Cookie 數。大多數浏覽器只允許每個站點保存 20 個 Cookie。如果試圖保存更多的 Cookie,則最先保存的 CookIE 就會被刪除。還有些浏覽器會對來自所有站點的 CookIE 總數作出限制,這個限制通常為 300 個。

  您最可能遇到的 CookIE 限制是:用戶可以設置自己的浏覽器,拒絕接受 Cookie。您很難解決這個問題,除非完全不使用 Cookie 而是通過其他機制來保存用戶相關信息。保存用戶信息的一種常用方法是會話狀態,但會話狀態又依賴於 Cookie。這一點在後面的 CookIE 和會話狀態中闡述。

  注意:有關狀態管理和 Web 應用程序中用於保存信息的選項的詳細信息,請參閱 Introduction to Web Forms State(英文)和 State Management Recommendations(英文)。
更一般的經驗很可能是,盡管 Cookie 在應用程序中非常有用,應用程序也不應該依賴於能夠保存 Cookie。利用 Cookie 可以做到錦上添花,但不要利用它們來支持關鍵功能。如果您的應用程序必須使用 Cookie,則您可以通過測試來確定浏覽器是否接受 CookIE。我在本文後面的檢查浏覽器是否接受 CookIE 一節中簡單介紹了一種測試方法。

  編寫 CookIE

  您可以利用頁面的 Response(英文)屬性來編寫 Cookie,該屬性提供的對象使用戶可以將信息添加到由頁面向浏覽器呈現的信息中。Response 對象支持一個名為 CookIEs(英文)的集合,您可以向其中添加要寫入浏覽器的 CookIE。

  注意:下面要討論的 Response 對象和 Request 對象分別是包含 HttpResponse(英文)和 HttpRequest(英文)類實例的頁面的屬性。要在文檔中查找 Response 和 Request 的信息,請參閱 HttpResponse 和 HttpRequest 下的內容。

  在創建 Cookie 時,您需要指定幾個值。最初,您要指定 Cookie 的名稱和其中保存的值。您可以創建多個 Cookie,每個 Cookie 都必須具有唯一的名稱,以便日後讀取時識別。(Cookie 是按名稱保存的,所以如果您創建了兩個名稱相同的 CookIE,後保存的那一個將覆蓋前一個。)

  您可能還希望指定 Cookie 的過期日期和時間。Cookie 一般都寫入到用戶的磁盤,然後可能一直都留在磁盤上。因此,您可以指定 Cookie 過期的日期和時間。當用戶再次訪問您的站點時,浏覽器會先檢查您站點的 Cookie 集合,如果某個 CookIE 已經過期,浏覽器不會把這個 CookIE 隨頁面請求一起發送給服務器,而是刪除這個已經過期的 Cookie。(您的站點可能已經在用戶計算機上寫入了多個 Cookie,每個 CookIE 都有各自的過期日期和時間。) 請注意,由浏覽器負責管理硬盤上的 Cookie,這將影響您在應用程序中對 CookIE 的使用,我很快會介紹這方面的內容。

  一個 Cookie 的有效期應為多長?這取決於 Cookie 的用途,換句話說,取決於您的應用程序需要 Cookie 值保持有效的時間有多長。如果利用 Cookie 統計網站的訪問者,您可以把有效期設置為 1 年,如果某個用戶已有一年時間未訪問您的站點,則可以把該用戶當作新的訪問者; 如果利用 Cookie 來保存用戶的首選項,則可以把其設置為永遠有效(例如 50 年後到期),因為定期重新設置首選項對用戶而言是比較麻煩的。有時,您可能需要編寫在數秒或數分鐘內即過期的 CookIE。在本文後面的檢查浏覽器是否接受 Cookie 一節中,我列舉了一個示例,該示例中創建的 CookIE 的實際有效期就只有幾秒。

  注意:不要忘記用戶隨時可以刪除自己計算機上的 Cookie,所以即使您保存了長期有效的 Cookie,用戶也可以自行決定將其全部刪除,同時清除保存在 CookIE 中的所有設置。

  如果沒有設置 Cookie 的有效期,還是可以創建 CookIE,但它不會保存到用戶的硬盤上,而是會成為用戶會話信息的一部分。如果用戶關閉浏覽器或會話超時,該 Cookie 就會被刪除。這種非永久性的 Cookie 很適合用來保存只需短時間保存的信息,或者保存由於安全原因不應該寫入客戶計算機磁盤的信息。例如,如果用戶使用的是一台公用計算機,而您不希望把 Cookie 寫入這種計算機的磁盤上,這時就可以使用非永久性的 CookIE。

  您可以通過多種方法把 Cookie 添加到 Response.CookIEs 集合中。以下示例介紹了兩種完成此任務的方法:

Response.CookIEs("userName").Value = "mike"
Response.CookIEs("userName").Expires = DateTime.Now.AddDays(1)

Dim aCookie As New HttpCookIE("lastVisit")
aCookIE.Value = DateTime.Now.ToString
aCookIE.Expires = DateTime.Now.AddDays(1)
Response.Cookies.Add(aCookIE)

  該示例向 Cookies 集合中添加了兩個 Cookie,一個稱為“userName”,另一個稱為“lastVisit”。對於第一個 Cookie,我直接設置了 Response.Cookies 集合的值。您可以使用這種方法向集合中添加值,因為 Response.CookIEs 是從 NameObjectCollectionBase(英文)類型的特殊集合派生得到的。

  對於第二個 Cookie,我創建了 Cookie 對象的一個實例(HttpCookie [英文] 類型),並設置了其屬性,然後通過 Add 方法把它添加到 Response.Cookies 集合。實例化 HttpCookie 對象時,您必須把 CookIE 名稱作為構造函數的一部分進行傳遞。

  這兩個示例完成了相同的任務,即向浏覽器寫入一個 Cookie。您要采用哪種方法主要取決於您的個人喜好。您可能會發現第二種方法在設置 CookIE 屬性方面要稍微容易一些,但同時您也會注意到兩者的差別並不是很大。

  在這兩種方法中,有效期值必須為 DateTime 類型。而“lastVisited”值也是日期/時間值。但在這種情況下,我必須把日期/時間值轉換為字符串,因為 CookIE 中的任何值最終都是以字符串的形式保存的。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved