當瀏覽器向伺服器發送請求時,該伺服器的 Cookie 會與請求一起發送。在 ASP.NET 應用程式中,您可以使用 Request 對象來讀取 Cookie。Request 對象的結構與 Response 對象的結構基本相同,所以從 Request 對象中讀取 Cookie 的方法與向 Response 對象中寫入 Cookie 的方法非常類似。以下樣本顯示了兩種方法,目的都是擷取名為“username”的 Cookie 的值並將值顯示在 Label 控制項中:
If Not Request.Cookies("userName") Is Nothing Then
Label1.Text = Server.HtmlEncode(Request.Cookies("userName").Value)
End If
If Not Request.Cookies("userName") Is Nothing Then
Dim aCookie As HttpCookie = Request.Cookies("userName")
Label1.Text = Server.HtmlEncode(aCookie.Value)
End If
在擷取 Cookie 的值之前,應該確保該 Cookie 確實存在。否則,您將得到一個 System.NullReferenceException(英文)異常。還需要注意的是,在頁面中顯示 Cookie 的內容之前,我調用了 HttpServerUtility.HtmlEncode(英文)方法對 Cookie 的內容進行編碼。之所以這樣做,是因為我要顯示 Cookie 的內容(一般您不會這樣做)而且要確保沒有任何惡意使用者在 Cookie 中添加了可執行指令碼。有關 Cookie 安全性的詳細資料,請參閱 Cookie 和安全性。
注意:由於不同的瀏覽器儲存 Cookie 的方式也不同,所以同一台電腦上的不同瀏覽器不一定能夠相互讀取各自的 Cookie。例如,如果使用 Internet Explorer 測試一個頁面,然後再使用其他瀏覽器進行測試,那麼後者就不會找到 Internet Explorer 儲存的 Cookie。當然,大多數人一般都是使用同一種瀏覽器進行 Web 互動的,因此在大多數情況下不會出現問題。但有時還是會遇到問題,比如您要測試應用程式對瀏覽器的相容性。
讀取 Cookie 中子索引值的方法與設定該值的方法類似。以下是擷取子索引值的一種方法:
If Not Request.Cookies("userInfo") Is Nothing Then
Label1.Text = _
Server.HtmlEncode(Request.Cookies("userInfo")("userName"))
Label2.text = _
Server.HtmlEncode(Request.Cookies("userInfo")("lastVisit"))
End If
在上面的樣本中,我擷取的是子鍵“lastVist”的值,在此前的討論中我把該值設定為 DateTime 值的字串表示形式。請記住,Cookie 是用字串的形式儲存值的,所以要將 lastVisit 值用作日期,就必須對其進行轉換:
Dim dt As DateTime
dt = CDate(Request.Cookies("userInfo")("lastVisit"))
Cookie 中子鍵的類型是 NameValueCollection(英文)類型的集合。因此,另一種擷取單個子鍵的方法是先擷取子鍵集合,然後按名稱提取子鍵的值,如下所示:
If Not Request.Cookies("userInfo") Is Nothing Then
Dim UserInfoCookieCollection As _
System.Collections.Specialized.NameValueCollection
UserInfoCookieCollection = Request.Cookies("userInfo").Values
Label1.Text = Server.HtmlEncode(UserInfoCookieCollection("userName"))
Label2.Text = Server.HtmlEncode(UserInfoCookieCollection("lastVisit"))
End If
就像設定 Cookie 一樣,使用哪種方法讀取 Cookie 也由您自己決定。
什麼是有效期間?
您可以讀取 Cookie 的名稱和值,除此以外,需要瞭解的有關 Cookie 的資訊並不是很多。雖然您可以擷取 Domain 和 Path 屬性,但是這些屬性的用途很有限。例如,您可以讀取 Domain 屬性,但如果您的頁面與 Cookie 不在相同的域,您根本就不會在頁面的位置接收到該 Cookie。
您無法讀取的是 Cookie 的到期日期和時間。事實上,當瀏覽器向伺服器發送 Cookie 資訊時,瀏覽器並未將到期資訊包括在內。您可以讀取 Expires 屬性,但總是返回為零的日期/時間值。
在前面的編寫 Cookie 一節中,我已經講過,是瀏覽器負責管理 Cookie 的,Expires 屬性就很好地印證了這一點。Expires 屬性的主要作用是協助瀏覽器執行有關 Cookie 儲存的日常管理。從伺服器的角度來看,Cookie 要麼存在要麼不存在,所以對伺服器而言,有效期間並不是有用的資訊。所以,瀏覽器在發送 Cookie 時並不提供此資訊。如果您需要 Cookie 的到期日期,就必須重新設定,關於這一點我將在修改和刪除 Cookie 中介紹。
更確切地說,您可以在向瀏覽器發送 Cookie 之前讀取已在 Response 對象中設定的 Expires 屬性,但您無法從返回的 Request 對象中擷取有效期間資訊。