Response.Cookies(“item-name”) = “item-value” |
Response.Cookies(“item-name”)(“sub-item-name”) = “sub-item-value” |
Response.Cookies(“item-name”).domain = “domain-url” Response.Cookies(“item-name”).path = “virtual-path” Response.Cookies(“item-name”).expires = #date# |
StrSingleValue = Request.Cookies(“item-name”) StrSubItemValue = Request.Cookies(“item-name”)(“sub-item-name”) |
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
假如把一個或多個成對的名稱/值附在請求頁面的URL后,就變成請求的查詢字符串,且在QueryString集合中提供給ASP頁面。單擊Web頁面、Email消息或其它文檔的超鏈接,或在瀏覽器的地址欄中輸入地址并按回車,或單擊瀏覽器中的Links或Favorites按鈕,所有這些都要使用GET方法。
因此,對這些動作中傳遞值給ASP的唯一方法是通過QueryString集合,把值附在URL后。
出現在Request.QueryString集合中并被訪問的值,與前面看到的Form集合實例中的工作方式相同。URL和查詢字符串的結合:
http://mysite.com/process_page.asp?FirstName=Priscilla&LastName=Descartes
可以采用如下方式訪問在QueryString集合中提供的值:
strFirstName = Request.QueryString(“FirstName”) ‘Return “Priscilla” strLastName = Request.QueryString(“LastName”) ‘Return “Descartes” strRaw = Request.QueryString ‘Return “FirstName=Priscilla&LastName=Descartes” |
窗體的GET和POST方法
在一個頁面內使用<FORM>段時,可以設置打開的FORM標記的METHOD屬性值為“GET”或“POST”,缺省值為“GET”。假如使用“GET”或省略其屬性,瀏覽器將該值綁定在頁面所有控件上,成為一個查詢字符串,且附在被請求頁面的URL上。
當這個請求到達Web服務器時,其值由ASP的Request.QueryString集合提供。然而,假如設置METHOD屬性為“POST”,瀏覽器將值包裝進發送服務器的HTTP報頭中,通過Request.Form集合提供給ASP。
通過來說,可以在所有的HTML窗體中使用POST方法。然而,瀏覽器或服務器的URL字符串長度存在一定的限制。因此,附有長的字符串可能會引起溢出和某些字符串的字符被截掉。同時,查詢字符串出現在瀏覽器的地址欄和所有的保存的鏈接和收藏夾中。不僅如此,還顯露了通過Web服務器時在HTTP請求中不想顯示的值,它也可能出現你的服務器和其他路由服務器的日志文件中。在HTTP請求報頭中的值很少是可見的,并且不出現在日志文件中。
使用POST方法需要注意的小問題是,當用戶重新下載<FORM>時,窗體的值將不再保留,其值為空且必須重新輸入。然而,當附在URL上時,其值被存儲為一個鏈接,將被保留,因此將出現在所有的URL與字符串結合的請求中,這或許是個優點也可能是個缺點,這根據應用而定(一些瀏覽器在客戶端上能夠在一定范圍內自動保留一個頁面上的值)。
另一點是URL與查詢字符串的結合體不能包含任何空格或其他非法字符,否則的話,Navigator和一些其他的瀏覽器將出現問題。非法字符是那些用來分隔URL和查詢字符串的部分,例如“/”、“:”、“?”和“&”(IE能夠自動將空格轉換為正確的格式——加號“+”,但其他的非法字符不能處理)
ASP中的cookie的使用
在這一節我們將學習那些提供給ASP代碼使用的集合、方法和屬性的各種技術。
1) cookie中存儲用戶的細節情況
可以使用cookie來存儲這兩類值:當瀏覽器關閉時我們不想保存的值(例如用戶的注冊信息)以及在用戶訪問站點時要保留的值。在每種情況下cookie的值對于來自用戶瀏覽器的每個頁面請求的ASP都是可用的。
然而,需要記住的是,cookie只有在對Cookie中的虛擬路徑(path)內的頁面發出請求時,才會發往服務器。缺省時,假如path的值在cookie中沒有設置,則其值為創建cookie的頁面的虛擬路徑。為使一個cookie發往一個站點的所有頁面,需要使用path=“/”。
這里是個實例,從自定義的Login頁面中,將用戶的注冊信息存貯在一個cookie中,由于沒有應用有效期,cookie值僅在關閉這個瀏覽器這前保留:
... Request.Cookies(“User”)(“UID”) = “<% = Request(“UserName”) %>” Request.Cookies(“User”)(“PWD”) = “<% = Request(“Password”) %>” Request.Cookies(“User”).Path = “/adminstuff” ‘Only applies to admin pages ... |
現在,在用戶從adminstuff目錄或其子目錄請求的每個頁面中,都可以找到這個cookie。假如它不存在,可以將用戶重定向到注冊頁面:
If (Request.Cookies(“User”)(“UID”) <> “alexhomer”) _ Or (Request.Cookies(“User”)(“PWD”) <> “secret”) Then Response.Redirect “login.asp?UserName=” & Request.Cookies(“User”)(“UID”) End If ... |
由于把cookie中的用戶名放在Response.Redirect的URL查詢字符串中,假如在口令輸入時出現錯誤且希望用戶不必重新鍵入用戶名,可以在login.asp頁面中使用它:
<FORM ACTION=”check_user.asp” METHOD=”POST”> <INPUT TYPE=”TEXT” NAME=”UserName” VALUE=”<% = Request.QueryString(“UserName”) %>”><P> <INPUT TYPE=”SUBMIT” VALUE=”LOGIN”> </FORM> |
2) 修改現有的cookie
可以使用ASP修改現有的cookie,但不能只修改cookie中的一個值。當更新一個在Response.Cookies集合中的Cookie時,現有的值將丟失。我們可以用如下代碼創建一個cookie,可以使用:
Response.Cookies(“VisitCount”)(“StartDate”) = dtmStart Response.Cookies(“VisitCount”)(“LastDate”) = Now Response.Cookies(“VisitCount”)(“Visits”) = CStr(intVisits) Response.Cookies(“VisitCount”).Path = “/” ‘Apply to entire site Response.Cookies(“VisitCount”).Expires = DateAdd(“m”,3,Now) |
假如想要更新Visits和LastDate的值,必須先不需改變的所有值,然后重寫整個的cookie:
datDtart = Response.Cookies(“VisitCount”)(“StartDate”) intVisits = Response.Cookies(“VisitCount”)(“Visits”) Response.Cookies(“VisitCount”)(“StartDate”) = dtmStart Response.Cookies(“VisitCount”)(“LastDate”) = Now Response.Cookies(“VisitCount”)(“Visits”) = Cstr(intVisits) Response.Cookies(“VisitCount”).Path = “/” Response.Cookies(“VisitCount”).Expires = DateADD(“m”,3,Now + 1)且對于幾乎所有的其他Response方法和屬性,應該在寫入任何內容(即打開<HTML>標記或任何文本或其他的HTML)到響應之前完成這個工作。 |
新聞熱點
疑難解答