ASP.NET中Cookie編程的基礎知識(3)
2024-07-10 13:01:55
供稿:網友
 
查看您的 cookie 
  您可能會發現,了解創建 cookie 的效果會對您很有幫助。而查看 cookie 是比較容易的,因為它們都是文本文件,關鍵在于您能找到它們。不同的瀏覽器保存 cookie 的方式也不同。我將介紹 internet explorer 是如何保存 cookie 的。如果您使用的是其他瀏覽器,請查看該瀏覽器的幫助,以了解有關 cookie 處理方面的知識。 
  查看 cookie 的一個簡便方法是讓 internet explorer 為您查找。在 internet explorer 中,從“工具”菜單中選擇“internet 選項”,在“常規”選項卡中單擊“設置”,然后單擊“查看文件”。internet explorer 將打開一個窗口,顯示所有的臨時文件,包括 cookie。在窗口中查找以“cookie:”開頭的文件 或查找文本文件。雙擊一個 cookie,在默認的文本文件中打開它。 
  您也可以在硬盤上查找 cookie 的文本文件,從而打開 cookie。internet explorer 將站點的 cookie 保存在文件名格式為 <user>@<domain>.txt 的文件中,其中 <user> 是您的帳戶名。例如,如果您的名稱為 mikepope,您訪問的站點為 www.contoso.com,那么該站點的 cookie 將保存在名為 [email protected] 的文件中。(該文件名可能包含一個順序的編號,如 [email protected][1].txt。) 
  這個 cookie 文本文件是與用戶相關的,所以會按照帳戶分別保存。例如,在 windows xp 中,您可以在如下所示的目錄中找到 cookie 文件: 
c:/documents and settings/<user>/cookies 
  要查找最新創建的 cookie,可以按修改日期對目錄內容進行排序,并查找最近修改的文件。 
  您可以使用文本編輯器打開 cookie。如果該文件包含多個 cookie,這些 cookie 之間將用星號 (*) 分隔。每個 cookie 的第一行是 cookie 的名稱,第二行是值,其余各行則包含 cookie 的日常處理信息,例如過期日期和時間。cookie 中還有一個簡單的校驗和,如果更改 cookie 名稱或值的長度,瀏覽器就會檢測到修改并刪除該 cookie。 
  多值 cookie(子鍵) 
  以上示例為每個要保存的值(用戶名、上次訪問時間)都使用了一個 cookie 。您也可以在一個 cookie 中保存多個名稱/值對。名稱/值對也稱作“鍵”或“子鍵”,具體取決于您讀取的內容。(如果您熟悉 url 的結構,就會發現子鍵與其中的查詢字符串非常相象。) 例如,如果不希望創建名為“username”和“lastvisit”的兩個單獨的 cookie,可以創建一個名為“userinfo”的 cookie,并使其包含兩個子鍵:“username”和“lastvisit”。 
  有很多原因會讓我們用子鍵來代替單獨的 cookie。最顯而易見的是,把相關或類似的信息放在一個 cookie 中會比較有條理。另外,由于所有信息都在一個 cookie 中,所以諸如有效期之類的 cookie 屬性就適用于所有信息。(當然,如果要為不同類型的信息指定不同的過期日期,就應該把信息保存在單獨的 cookie 中。) 
  帶有子鍵的 cookie 還可以幫助您減小 cookie 的大小。如前面的 cookie 的限制一節所述,cookie 的總大小限制在 4096 字節以內,而且不能為一個網站保存超過 20 個 cookie。利用帶子鍵的單個 cookie,站點的 cookie 數量就不會超過 20 個的限制。此外,一個 cookie 會占用大約 50 個字符的基本空間開銷(用于保存有效期信息等),再加上其中保存的值的長度,其總和接近 4k 的限制。如果使用五個子鍵而不是五個單獨的 cookie,您可以省去四個 cookie 的基本空間開銷,總共能節省大約 200 個字節。 
  要創建帶子鍵的 cookie,您可以使用用于編寫單個 cookie 的各種語法。以下示例顯示了編寫同一 cookie 的兩種不同方法,其中的每個 cookie 都帶有兩個子鍵: 
response.cookies("userinfo")("username") = "mike" 
response.cookies("userinfo")("lastvisit") = datetime.now.tostring 
response.cookies("userinfo").expires = datetime.now.adddays(1) 
dim acookie as new httpcookie("userinfo") 
acookie.values("username") = "mike" 
acookie.values("lastvisit") = datetime.now.tostring 
acookie.expires = datetime.now.adddays(1) 
response.cookies.add(acookie) 
  控制 cookie 有效范圍 
  默認情況下,一個站點的全部 cookie 都一起保存在客戶機上,而且所有這些 cookie 都會隨著對該站點發送的請求一起發送到服務器,也就是說,站點的每個頁面都能得到該站點的所有 cookie。但有時候,您可能希望 cookie 更具有針對性,這時,您可以通過兩種方法設置 cookie 的有效范圍: 
  把 cookie 的有效范圍限制在服務器上的一個文件夾中,實際上這樣就將 cookie 限制到站點上的某個應用程序。 
  把有效范圍設置為某個域,從而允許您指定域中的哪些子域可以訪問 cookie。 
  將 cookie 限制到某個文件夾或應用程序 
  要將 cookie 限制到服務器上的某個文件夾,請按如下方法設置 cookie 的 path 屬性: 
dim appcookie as new httpcookie("appcookie") 
appcookie.value = "written " & now.tostring 
appcookie.expires = now.adddays(1) 
appcookie.path = "/application1" 
response.cookies.add(appcookie) 
  當然,您也可以通過直接設置 response.cookies 來編寫 cookie,如前文所述。 
  路徑可以是站點根目錄下的物理路徑,也可以是虛擬根目錄。這樣一來,cookie 就只能用于 application1 文件夾或虛擬根目錄中的頁面。例如,如果您的站點名為 www.contoso.com,則前面示例中生成的 cookie 就只能用于路徑為 http://www.contoso.com/application1/ 的頁面以及該文件夾下的所有頁面,而不適用于其他應用程序中的頁面,如 http://www.contoso.com/application2/ 或 http://www.contoso.com/ 下的頁面。 
  提示:通過對 internet explorer 和 mozilla 瀏覽器進行測試發現,此處使用的路徑是區分大小寫的。一般而言,windows 服務器上的 url 不區分大小寫,但這種情況例外。您無法控制用戶如何在瀏覽器中輸入 url,但是,如果您的應用程序依賴于與特定路徑相關的 cookie,則請確保您所創建的所有超鏈接中的 url 與 path 屬性值的大小寫相匹配。 
  將 cookie 的有效范圍限制到域 
  默認情況下,cookie 與特定的域相關聯。例如,如果您的站點是 www.contoso.com,那么當用戶向該站點請求頁面時,您編寫的 cookie 就被發送到服務器。(有特定路徑值的 cookie 除外,我在上一節剛剛解釋過。) 如果您的站點有子域(例如 contoso.com、sales.contoso.com 和 support.contoso.com),就可以把 cookie 同特定的子域相關聯。為此,需要設置 cookie 的 domain 屬性,如下所示: 
response.cookies("domain").value = datetime.now.tostring 
response.cookies("domain").expires = datetime.now.adddays(1) 
response.cookies("domain").domain = "support.contoso.com" 
  如果按照這種方式設置域,則 cookie 只能用于指定子域中的頁面。 
  您也可以利用 domain 屬性來創建可在多個子域中共享的 cookie。例如,對域進行如下設置: 
response.cookies("domain").value = datetime.now.tostring 
response.cookies("domain").expires = datetime.now.adddays(1) 
response.cookies("domain").domain = "contoso.com" 
  這樣,該 cookie 就可用于主域、sales.contoso.com 和 support.contoso.com。