在ASP中訪問和更新Cookies集合

字號:

Cookies的值比ASP其他集合(例如Form和ServerVariables)的值要復雜得多。Cookie是一小塊由瀏覽器存貯在客戶端系統(tǒng)上的文本,且隨同每次請求發(fā)往它們應用于的域中的服務器。
    ASP使得應用cookie較為容易,可以從Request對象的Cookies集合中獲得所有隨同請求發(fā)出的cookie值,并可創(chuàng)建或修改cookie,通過Response對象的Cookies集合發(fā)回給用戶。
    Cookie包含可用兩種方式構造的信息,單值cookie提供其值給代碼是通過一個一般的類ASP集合。然而,集合的每個成員可能本身也是一個集合,包含這種信息的cookie通過稱為多值(multiple-Value)cookie。
    創(chuàng)建一個單值的cookie較為簡單,如下所示:
    Response.Cookies(“item-name”) = “item-value”
    創(chuàng)建一個多值的cookie,可以使用如下命令:
    Response.Cookies(“item-name”)(“sub-item-name”) = “sub-item-value”
    設置cookie應用的域及路徑及其有效期,我們使用:
    Response.Cookies(“item-name”).domain = “domain-url” Response.Cookies(“item-name”).path = “virtual-path” Response.Cookies(“item-name”).expires = #date#   通常,客戶只在對創(chuàng)建cookie的目錄中的頁面提出請求時,才將cookie隨請示發(fā)住服務器。通過指定path屬性,可以指定站點中何處這個cookie是合法的,并且這個cookie將隨請求發(fā)送。如果cookie隨對整個站點的頁面請求發(fā)送,設置path為“/”。
    假如Expires屬性沒有設置,關閉當前的瀏覽器實例時,cookie將被自動消除。
    注意,我們在向瀏覽器發(fā)送任何輸出時,已經(jīng)創(chuàng)建了cookie。因為,這些cookie是頁面HTTP報頭的一部分。
    在ASP 3.0中,緩沖的缺省狀態(tài)是打開的,且沒有輸出被發(fā)送,除非使用Response.Flush指定做這個工作或者頁面已到末端。這意味著創(chuàng)建cookie的代碼可以在頁面上的任何位置,直到任何輸出“刷新”(flush)到客戶端前,它都可以被執(zhí)行。
    要讀現(xiàn)有的cookie,使用Request.Cookies集合。可以單獨訪問其中的項目,方法類似于創(chuàng)建它們時使用的方法。
    StrSingleValue = Request.Cookies(“item-name”) StrSubItemValue = Request.Cookies(“item-name”)(“sub-item-name”)
    注意Request.Cookies集合(和所有其他Request集合一樣)是只讀的。Response.Cookies集合是只寫的,事實上可以訪問這個集合中一系列cookie的名稱,而不是它們的值。
    遍歷Cookies集合
    為了使用Cookies集合更加方便,可使用名稱為Haskeys的附加屬性。假如訪問的cookie本身也是個集合,即它是一個多值的cookie,這將返回True。使用Haskeys屬性,可以遍歷完整的Request.Cookies集合,從而獲得所有cookie的列表及它們的值。
    For Each objItem In Request.Cookies If Request.Cookies(objItem).HasKey Then ‘Use another For Each to iterate all subkeys For Each objItemKey in Request.Cookies(objItem) Response.Write objItem & “(“ & objItemKey & “) = “_ & Request.Cookies(objItem)(objItemKey) & “<BR>” Next Else ‘Print out the cookie string as normal Response.Write objItem & “ = ”& Request.Cookies(objItem) & “<BR>” End If Next   這非常類似于前面的從Request.Form集合中提取多個值的復雜代碼。但是這里可以使用Haskeys屬性來判別每個條目是否為一個集合。而在Form例子里,必須查詢Request.Form(item_name).Count屬性,這是因為Form集合(和所有的除cookie外的其他集合)成員不可能是真正的集合。ASP只是做了“幕后”的工作,得到了每個多條目集合的值。
    Form和QueryString的差異
    了解了訪問各種ASP集合的技術以后,需要解決另一個問題是:Form和QueryString集合之間的差異是什么?假如準備使用ASP,毫無疑問應該清楚這種差異,但需要參考HTTP工作方式來重新認識,理解它們。
    通過HTTP從Web服務器請求頁面或其他資源,有兩個通用的方法??墒褂肎ET方法直接獲得資源,也可使用POST把值傳給相應資源。GET方法是缺省的,可以看一下本章前面的一個HTTP請求的實例:
    7/8/99 10:27:16 Sent GET /Store/Download.asp HTTP/1.1