熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 12:21:42  來源: .NET編程 

  簡介

  Cookie 為 Web 應用程序保存用戶相關信息提供了一種有用的方法例如當用戶訪問您的站點時您可以利用 Cookie 保存用戶首選項或其他信息這樣當用戶下次再訪問您的站點時應用程序就可以檢索以前保存的信息

  本文概要介紹 Cookie 在 ASPNET 應用程序中的應用為您展示在 ASPNET 中應用 Cookie 的技術細節例如編寫 Cookie然後再讀取它們同時還將為您介紹 Cookie 的各種特性和各種特殊情況以及 ASPNET 對 Cookie 的支持

  什麼是 Cookie?

  Cookie 是一小段文本信息伴隨著用戶請求和頁面在 Web 服務器和浏覽器之間傳遞用戶每次訪問站點時Web 應用程序都可以讀取 Cookie 包含的信息

  假設在用戶請求訪問您的網站 wwwcontosocom 上的某個頁面時您的應用程序發送給該用戶的不僅僅是一個頁面還有一個包含日期和時間的 Cookie用戶的浏覽器在獲得頁面的同時還得到了這個 Cookie並且將它保存在用戶硬盤上的某個文件夾中

  以後如果該用戶再次訪問您站點上的頁面當該用戶輸入 URL wwwcontosocom 時浏覽器就會在本地硬盤上查找與該 URL 相關聯的 Cookie如果該 Cookie 存在浏覽器就將它與頁面請求一起發送到您的站點您的應用程序就能確定該用戶上一次訪問站點的日期和時間您可以根據這些信息向用戶發送一條消息也可以檢查過期時間或執行其他有用的功能

  Cookie 是與 Web 站點而不是與具體頁面關聯的所以無論用戶請求浏覽站點中的哪個頁面浏覽器和服務器都將交換 wwwcontosocom 的 Cookie 信息用戶訪問其他站點時每個站點都可能會向用戶浏覽器發送一個 Cookie而浏覽器會將所有這些 Cookie 分別保存

  以上就是 Cookie 的基本工作原理那麼Cookie 有哪些用途呢?最根本的用途是 Cookie 能夠幫助 Web 站點保存有關訪問者的信息更概括地說Cookie 是一種保持 Web 應用程序連續性(即執行狀態管理)的方法浏覽器和 Web 服務器除了在短暫的實際信息交換階段以外總是斷開的而用戶向 Web 服務器發送的每個請求都是單獨處理的與其他所有請求無關然而在大多數情況下都有必要讓 Web 服務器在您請求某個頁面時對您進行識別例如購物站點上的 Web 服務器跟蹤每個購物者以便站點能夠管理購物車和其他的用戶相關信息因此 Cookie 的作用就類似於名片它提供了相關的標識信息可以幫助應用程序確定如何繼續執行

  使用 Cookie 能夠達到多種目的所有這些目的都是為了使 Web 站點記住您例如一個實施民意測驗的站點可以簡單地利用 Cookie 作為布爾值表示您的浏覽器是否已經參與了投票從而避免您重復投票 而那些要求用戶登錄的站點則可以通過 Cookie 來確定您是否已經登錄過這樣您就不必每次都輸入憑據

  有關 Cookie 的更多背景信息建議您閱讀 Verizon Web 站點中的How Internet Cookies Work一文地址為 http://wwwverizoncom/about/community/learningcenter/articles/displayarticle/zhtml(英文)其作者詳細解釋了什麼是 Cookie 以及 Cookie 是如何在浏覽器和服務器之間交換信息的他還全面總結了 Cookie 涉及的隱私問題

  順便問一下您是否想知道它們為什麼被稱作Cookie?Jargon File(又稱為The New Hackers Dictionary)版本 對這一術語的詞源給出了准確的定義和合理的解釋您可以在 http://wwwcatborg/~esr/jargon/jargonhtml#cookie(英文)找到相關的條目

  在此後的內容中本文將假設您已經知道什麼是 Cookie並且假設您已經清楚為什麼要在 ASPNET 應用程序中使用 Cookie

  Cookie 的限制

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

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

  您最可能遇到的 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 統計網站的訪問者您可以把有效期設置為 如果某個用戶已有一年時間未訪問您的站點則可以把該用戶當作新的訪問者 如果利用 Cookie 來保存用戶的首選項則可以把其設置為永遠有效(例如 年後到期)因為定期重新設置首選項對用戶而言是比較麻煩的有時您可能需要編寫在數秒或數分鐘內即過期的 Cookie在本文後面的檢查浏覽器是否接受 Cookie 一節中我列舉了一個示例該示例中創建的 Cookie 的實際有效期就只有幾秒

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

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

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

ResponseCookies(userName)Value = mike
ResponseCookies(userName)Expires = DateTimeNowAddDays()

Dim aCookie As New HttpCookie(lastVisit)
aCookieValue = DateTimeNowToString
aCookieExpires = DateTimeNowAddDays()
ResponseCookiesAdd(aCookie)

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

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

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

  在這兩種方法中有效期值必須為 DateTime 類型lastVisited值也是日期/時間值但在這種情況下我必須把日期/時間值轉換為字符串因為 Cookie 中的任何值最終都是以字符串的形式保存的

  查看您的 Cookie

  您可能會發現了解創建 Cookie 的效果會對您很有幫助而查看 Cookie 是比較容易的因為它們都是文本文件關鍵在於您能找到它們不同的浏覽器保存 Cookie 的方式也不同我將介紹 Internet Explorer 是如何保存 Cookie 的如果您使用的是其他浏覽器請查看該浏覽器的幫助以了解有關 Cookie 處理方面的知識

  查看 Cookie 的一個簡便方法是讓 Internet Explorer 為您查找在 Internet Explorer 中工具菜單中選擇Internet 選項常規選項卡中單擊設置然後單擊查看文件Internet Explorer 將打開一個窗口顯示所有的臨時文件包括 Cookie在窗口中查找以Cookie:開頭的文件 或查找文本文件雙擊一個 Cookie在默認的文本文件中打開它

  您也可以在硬盤上查找 Cookie 的文本文件從而打開 CookieInternet Explorer 將站點的 Cookie 保存在文件名格式為 @txt 的文件中其中 是您的帳戶名例如如果您的名稱為 mikepope您訪問的站點為 wwwcontosocom那麼該站點的 Cookie 將保存在名為 mikepope@wwwcontosotxt 的文件中(該文件名可能包含一個順序的編號如 mikepope@wwwcontoso[]txt

  這個 Cookie 文本文件是與用戶相關的所以會按照帳戶分別保存例如在 Windows XP 中您可以在如下所示的目錄中找到 Cookie 文件

c:\Documents and Settings\\Cookies

  要查找最新創建的 Cookie可以按修改日期對目錄內容進行排序並查找最近修改的文件

  您可以使用文本編輯器打開 Cookie如果該文件包含多個 Cookie這些 Cookie 之間將用星號 (*) 分隔每個 Cookie 的第一行是 Cookie 的名稱第二行是值其余各行則包含 Cookie 的日常處理信息例如過期日期和時間Cookie 中還有一個簡單的校驗和如果更改 Cookie 名稱或值的長度浏覽器就會檢測到修改並刪除該 Cookie

  多值 Cookie(子鍵)

  以上示例為每個要保存的值(用戶名上次訪問時間)都使用了一個 Cookie 您也可以在一個 Cookie 中保存多個名稱/值對名稱/值對也稱作子鍵具體取決於您讀取的內容(如果您熟悉 URL 的結構就會發現子鍵與其中的查詢字符串非常相象) 例如如果不希望創建名為userNamelastVisit的兩個單獨的 Cookie可以創建一個名為userInfo的 Cookie並使其包含兩個子鍵userNamelastVisit

  有很多原因會讓我們用子鍵來代替單獨的 Cookie最顯而易見的是把相關或類似的信息放在一個 Cookie 中會比較有條理另外由於所有信息都在一個 Cookie 中所以諸如有效期之類的 Cookie 屬性就適用於所有信息(當然如果要為不同類型的信息指定不同的過期日期就應該把信息保存在單獨的 Cookie 中

  帶有子鍵的 Cookie 還可以幫助您減小 Cookie 的大小如前面的 Cookie 的限制一節所述Cookie 的總大小限制在 字節以內而且不能為一個網站保存超過 個 Cookie利用帶子鍵的單個 Cookie站點的 Cookie 數量就不會超過 個的限制此外一個 Cookie 會占用大約 個字符的基本空間開銷(用於保存有效期信息等)再加上其中保存的值的長度其總和接近 K 的限制如果使用五個子鍵而不是五個單獨的 Cookie您可以省去四個 Cookie 的基本空間開銷總共能節省大約 個字節

  要創建帶子鍵的 Cookie您可以使用用於編寫單個 Cookie 的各種語法以下示例顯示了編寫同一 Cookie 的兩種不同方法其中的每個 Cookie 都帶有兩個子鍵

ResponseCookies(userInfo)(userName) = mike
ResponseCookies(userInfo)(lastVisit) = DateTimeNowToString
ResponseCookies(userInfo)Expires = DateTimeNowAddDays()

Dim aCookie As New HttpCookie(userInfo)
aCookieValues(userName) = mike
aCookieValues(lastVisit) = DateTimeNowToString
aCookieExpires = DateTimeNowAddDays()
ResponseCookiesAdd(aCookie)

  控制 Cookie 有效范圍

  默認情況下一個站點的全部 Cookie 都一起保存在客戶機上而且所有這些 Cookie 都會隨著對該站點發送的請求一起發送到服務器也就是說站點的每個頁面都能得到該站點的所有 Cookie但有時候您可能希望 Cookie 更具有針對性這時您可以通過兩種方法設置 Cookie 的有效范圍

  ·把 Cookie 的有效范圍限制在服務器上的一個文件夾中實際上這樣就將 Cookie 限制到站點上的某個應用程序

  ·把有效范圍設置為某個域從而允許您指定域中的哪些子域可以訪問 Cookie

  1將 Cookie 限制到某個文件夾或應用程序

  要將 Cookie 限制到服務器上的某個文件夾請按如下方法設置 Cookie 的 Path 屬性

Dim appCookie As New HttpCookie(AppCookie)
appCookieValue = written & NowToString
appCookieExpires = NowAddDays()
appCookiePath = /Application
ResponseCookiesAdd(appCookie)

  當然您也可以通過直接設置 ResponseCookies 來編寫 Cookie如前文所述

  路徑可以是站點根目錄下的物理路徑也可以是虛擬根目錄這樣一來Cookie 就只能用於 Application 文件夾或虛擬根目錄中的頁面例如如果您的站點名為 wwwcontosocom則前面示例中生成的 Cookie 就只能用於路徑為 http://wwwcontosocom/Application/ 的頁面以及該文件夾下的所有頁面而不適用於其他應用程序中的頁面如 http://wwwcontosocom/Application/ 或 http://wwwcontosocom/ 下的頁面

  提示通過對 Internet Explorer 和 Mozilla 浏覽器進行測試發現此處使用的路徑是區分大小寫的一般而言Windows 服務器上的 URL 不區分大小寫但這種情況例外您無法控制用戶如何在浏覽器中輸入 URL但是如果您的應用程序依賴於與特定路徑相關的 Cookie則請確保您所創建的所有超鏈接中的 URL 與 Path 屬性值的大小寫相匹配

  2將Cookie 的有效范圍限制到域

  默認情況下Cookie 與特定的域相關聯例如如果您的站點是 wwwcontosocom那麼當用戶向該站點請求頁面時您編寫的 Cookie 就被發送到服務器(有特定路徑值的 Cookie 除外我在上一節剛剛解釋過) 如果您的站點有子域(例如 contosocomsalescontosocom 和 supportcontosocom)就可以把 Cookie 同特定的子域相關聯為此需要設置 Cookie 的 Domain 屬性如下所示

ResponseCookies(domain)Value = DateTimeNowToString
ResponseCookies(domain)Expires = DateTimeNowAddDays()
ResponseCookies(domain)Domain = supportcontosocom

  如果按照這種方式設置域則 Cookie 只能用於指定子域中的頁面

  您也可以利用 Domain 屬性來創建可在多個子域中共享的 Cookie例如對域進行如下設置

ResponseCookies(domain)Value = DateTimeNowToString
ResponseCookies(domain)Expires = DateTimeNowAddDays()
ResponseCookies(domain)Domain = contosocom

  這樣該 Cookie 就可用於主域salescontosocom 和 supportcontosocom


From:http://tw.wingwit.com/Article/program/net/201311/15746.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.