Cookies的值比ASP其他集合(例如Form和ServerVariables)的值要復雜得多Cookie是一小塊由浏覽器存貯在客戶端系統上的文本且隨同每次請求發往它們應用於的域中的服務器
ASP使得應用cookie較為容易可以從Request對象的Cookies集合中獲得所有隨同請求發出的cookie值並可創建或修改cookie通過Response對象的Cookies集合發回給用戶
Cookie包含可用兩種方式構造的信息單值cookie提供其值給代碼是通過一個一般的類ASP集合然而集合的每個成員可能本身也是一個集合包含這種信息的cookie通過稱為多值(multipleValue)cookie
創建一個單值的cookie較為簡單如下所示
ResponseCookies(“itemname”) = “itemvalue”
創建一個多值的cookie可以使用如下命令
ResponseCookies(“itemname”)(“subitemname”) = “subitemvalue”
設置cookie應用的域及路徑及其有效期我們使用
ResponseCookies(“itemname”)domain = “domainurl”
ResponseCookies(“itemname”)path = “virtualpath”
ResponseCookies(“itemname”)expires = #date#
通常客戶只在對創建cookie的目錄中的頁面提出請求時才將cookie隨請示發住服務器通過指定path屬性可以指定站點中何處這個cookie是合法的並且這個cookie將隨請求發送如果cookie隨對整個站點的頁面請求發送設置path為“/”
假如Expires屬性沒有設置關閉當前的浏覽器實例時cookie將被自動消除
注意我們在向浏覽器發送任何輸出時已經創建了cookie因為這些cookie是頁面HTTP報頭的一部分
在ASP 中緩沖的缺省狀態是打開的且沒有輸出被發送除非使用ResponseFlush指定做這個工作或者頁面已到末端這意味著創建cookie的代碼可以在頁面上的任何位置直到任何輸出“刷新”(flush)到客戶端前它都可以被執行
要讀現有的cookie使用RequestCookies集合可以單獨訪問其中的項目方法類似於創建它們時使用的方法
StrSingleValue = RequestCookies(“itemname”)
StrSubItemValue = RequestCookies(“itemname”)(“subitemname”)
注意RequestCookies集合(和所有其他Request集合一樣)是只讀的ResponseCookies集合是只寫的事實上可以訪問這個集合中一系列cookie的名稱而不是它們的值
遍歷Cookies集合
為了使用Cookies集合更加方便可使用名稱為Haskeys的附加屬性假如訪問的cookie本身也是個集合即它是一個多值的cookie這將返回True使用Haskeys屬性可以遍歷完整的RequestCookies集合從而獲得所有cookie的列表及它們的值
For Each objItem In RequestCookies
If RequestCookies(objItem)HasKey Then
‘Use another For Each to iterate all subkeys
For Each objItemKey in RequestCookies(objItem)
ResponseWrite objItem & “(“ & objItemKey & “) = “_
& RequestCookies(objItem)(objItemKey) & “<BR>”
Next
Else
‘Print out the cookie string as normal
ResponseWrite objItem & “ = ”& RequestCookies(objItem) & “<BR>”
End If
Next
這非常類似於前面的從RequestForm集合中提取多個值的復雜代碼但是這裡可以使用Haskeys屬性來判別每個條目是否為一個集合而在Form例子裡必須查詢RequestForm(item_name)Count屬性這是因為Form集合(和所有的除cookie外的其他集合)成員不可能是真正的集合ASP只是做了“幕後”的工作得到了每個多條目集合的值
Form和QueryString的差異
了解了訪問各種ASP集合的技術以後需要解決另一個問題是Form和QueryString集合之間的差異是什麼?假如准備使用ASP毫無疑問應該清楚這種差異但需要參考HTTP工作方式來重新認識理解它們
通過HTTP從Web服務器請求頁面或其他資源有兩個通用的方法可使用GET方法直接獲得資源也可使用POST把值傳給相應資源GET方法是缺省的可以看一下本章前面的一個HTTP請求的實例
// :: Sent GET /Store/Downloadasp HTTP/
假如把一個或多個成對的名稱/值附在請求頁面的URL後就變成請求的查詢字符串且在QueryString集合中提供給ASP頁面單擊Web頁面Email消息或其它文檔的超鏈接或在浏覽器的地址欄中輸入地址並按回車或單擊浏覽器中的Links或Favorites按鈕所有這些都要使用GET方法
因此對這些動作中傳遞值給ASP的唯一方法是通過QueryString集合把值附在URL後
出現在RequestQueryString集合中並被訪問的值與前面看到的Form集合實例中的工作方式相同URL和查詢字符串的結合
可以采用如下方式訪問在QueryString集合中提供的值
strFirstName = RequestQueryString(“FirstName”) ‘Return “Priscilla”
strLastName = RequestQueryString(“LastName”) ‘Return “Descartes”
strRaw = RequestQueryString
‘Return “FirstName=Priscilla&LastName=Descartes”
窗體的GET和POST方法
在一個頁面內使用<FORM>段時可以設置打開的FORM標記的METHOD屬性值為“GET”或“POST”缺省值為“GET”假如使用“GET”或省略其屬性浏覽器將該值綁定在頁面所有控件上成為一個查詢字符串且附在被請求頁面的URL上
當這個請求到達Web服務器時其值由ASP的RequestQueryString集合提供然而假如設置METHOD屬性為“POST”浏覽器將值包裝進發送服務器的HTTP報頭中通過RequestForm集合提供給ASP
通過來說可以在所有的HTML窗體中使用POST方法然而浏覽器或服務器的URL字符串長度存在一定的限制因此附有長的字符串可能會引起溢出和某些字符串的字符被截掉同時查詢字符串出現在浏覽器的地址欄和所有的保存的鏈接和收藏夾中不僅如此還顯露了通過Web服務器時在HTTP請求中不想顯示的值它也可能出現你的服務器和其他路由服務器的日志文件中在HTTP請求報頭中的值很少是可見的並且不出現在日志文件中
使用POST方法需要注意的小問題是當用戶重新下載<FORM>時窗體的值將不再保留其值為空且必須重新輸入然而當附在URL上時其值被存儲為一個鏈接將被保留因此將出現在所有的URL與字符串結合的請求中這或許是個優點也可能是個缺點這根據應用而定(一些浏覽器在客戶端上能夠在一定范圍內自動保留一個頁面上的值)
另一點是URL與查詢字符串的結合體不能包含任何空格或其他非法字符否則的話Navigator和一些其他的浏覽器將出現問題非法字符是那些用來分隔URL和查詢字符串的部分例如“/”“:”“?”和“&”(IE能夠自動將空格轉換為正確的格式——加號“+”但其他的非法字符不能處理)
ASP中的cookie的使用
在這一節我們將學習那些提供給ASP代碼使用的集合方法和屬性的各種技術
) cookie中存儲用戶的細節情況
可以使用cookie來存儲這兩類值當浏覽器關閉時我們不想保存的值(例如用戶的注冊信息)以及在用戶訪問站點時要保留的值在每種情況下cookie的值對於來自用戶浏覽器的每個頁面請求的ASP都是可用的
然而需要記住的是cookie只有在對Cookie中的虛擬路徑(path)內的頁面發出請求時才會發往服務器缺省時假如path的值在cookie中沒有設置則其值為創建cookie的頁面的虛擬路徑為使一個cookie發往一個站點的所有頁面需要使用path=“/”
這裡是個實例從自定義的Login頁面中將用戶的注冊信息存貯在一個cookie中由於沒有應用有效期cookie值僅在關閉這個浏覽器這前保留
RequestCookies(“User”)(“UID”) = “<% = Request(“UserName”) %>”
RequestCookies(“User”)(“PWD”) = “<% = Request(“Password”) %>”
RequestCookies(“User”)Path = “/adminstuff” ‘Only applies to admin pages
現在在用戶從adminstuff目錄或其子目錄請求的每個頁面中都可以找到這個cookie假如它不存在可以將用戶重定向到注冊頁面
If (RequestCookies(“User”)(“UID”) <> “alexhomer”) _
Or (RequestCookies(“User”)(“PWD”) <> “secret”) Then
ResponseRedirect “loginasp?UserName=” & RequestCookies(“User”)(“UID”)
End If
由於把cookie中的用戶名放在ResponseRedirect的URL查詢字符串中假如在口令輸入時出現錯誤且希望用戶不必重新鍵入用戶名可以在loginasp頁面中使用它
<FORM ACTION=”check_userasp” METHOD=”POST”>
<INPUT TYPE=”TEXT” NAME=”UserName”
VALUE=”<% = RequestQueryString(“UserName”) %>”><P>
<INPUT TYPE=”SUBMIT” VALUE=”LOGIN”>
</FORM>
) 修改現有的cookie
可以使用ASP修改現有的cookie但不能只修改cookie中的一個值當更新一個在ResponseCookies集合中的Cookie時現有的值將丟失我們可以用如下代碼創建一個cookie可以使用
ResponseCookies(“VisitCount”)(“StartDate”) = dtmStart
ResponseCookies(“VisitCount”)(“LastDate”) = Now
ResponseCookies(“VisitCount”)(“Visits”) = CStr(intVisits)
ResponseCookies(“VisitCount”)Path = “/” ‘Apply to entire site
ResponseCookies(“VisitCount”)Expires = DateAdd(“m”Now)
假如想要更新Visits和LastDate的值必須先不需改變的所有值然後重寫整個的cookie
datDtart = ResponseCookies(“VisitCount”)(“StartDate”)
intVisits = ResponseCookies(“VisitCount”)(“Visits”)
ResponseCookies(“VisitCount”)(“StartDate”) = dtmStart
ResponseCookies(“VisitCount”)(“LastDate”) = Now
ResponseCookies(“VisitCount”)(“Visits”) = Cstr(intVisits)
ResponseCookies(“VisitCount”)Path = “/”
ResponseCookies(“VisitCount”)Expires = DateADD(“m”Now + )且對於幾乎所有的其他Response方法和屬性應該在寫入任何內容(即打開<HTML>標記或任何文本或其他的HTML)到響應之前完成這個工作
From:http://tw.wingwit.com/Article/program/net/201311/14068.html