Request和Response這兩個對象是ASP所提供的內建對象中最常用的兩個。在瀏覽器(或其他使用者代理程式)和Web伺服器之間,請求與響應中發生的資訊交流可以通過ASP中的兩個內建對象來進行訪問和管理,這兩個對象稱為Request和Response對象。
在ASP頁中所要進行的工作幾乎都要訪問這兩個對象,使用這兩個對象的方式將影響頁面的效率及可靠性。當然,它們的主要用途是訪問使用者發回到伺服器的值,即從HTML頁的<FORM>段獲得或附在URL後面作為查詢字串,並建立合適的輸出返回給使用者,且它們可以共用很多相同的因素。例如兩個對象都可以使用儲存在用戶端電腦上的cookie。
因此,我們把內容分成兩個獨立的部分(每個對象一部分),並且首先從用戶端與伺服器這間的資訊交流入手,然後再研究每一個對象。
研究的內容是:
· 用戶端與伺服器如何交流以傳遞Web或其他資源。
· Request和Response對象的細節,以及它們之間的共同點。
· 如何通過一個表單和查詢字串訪問相應的值。
· 如何讀入或建立cookie並存放在用戶端的電腦上。
· 伺服器的變數是什嗎?如何訪問和修改HTTP前序。
· 說明其他相關條目的變化,如客戶的認證使用。
用戶端和伺服器的交流
為節省篇幅,後面的內容中使用“瀏覽器”(browser)一詞。但需要記住的是,能夠訪問Web頁面的應用程式絕不僅只有瀏覽器,有許多特殊的應用程式從網站上下載網頁,如為那些視力有缺陷使用者設計的特殊的用戶端程式或者是用通常的瀏覽器有其他困難的人。最顯而易見的例子是搜尋引擎用來訪問Web上的網站的robot。全面考慮這些因素,包括普通的Web瀏覽器,準確的詞彙應該是使用者代理程式(user agent)。
頁面請求的對話
當一個瀏覽器向Web網站提出頁面請求時,顯然必須告訴伺服器,其請求的是哪一個頁面。首先要做的是通過網域名稱與伺服器建立串連,然後提供所請求的頁面的全路徑和名稱。為什麼要全路徑和名稱?Web是一個無國界的環境,所以必須創造一個會話標識每個客戶(將在以後介紹ASP如何做到這點)。
這就意味著每當伺服器完成向客戶發送頁面後,伺服器就徹底忘記了這個客戶。因此,當客戶請求下一個頁面時,與一個新的訪問者是完全相同的。伺服器無法記住這個客戶,相應的,也就無法判斷它們上次請求的頁面是哪一個。因為,不能使用相對路徑來提供一個頁面,即使頁麵包含一個相對的連結也不行,例如:
| <A HREF=”Download.asp”>Next Page</A> |
瀏覽器將自動建立完整的新頁面的URL,方法是使用當前頁的域和路徑;或使用頁面<HEAD>段中的<BASE>元素,告訴瀏覽器一個頁面中所有連結的其URL是什麼。例如:
| <BASE HERF=http://www.wrox.com/Store> |
當把滑鼠指向一個頁面的連結時,可在瀏覽器的狀態列中看到。當前頁面的路徑和當前網域名稱或基網域名稱或基路徑已經與請求的頁面名結合在一起了。
1、客戶請求的細節
所請求頁面的全路徑和名稱的組合是瀏覽器請求頁面時發住伺服器的唯一住處瀏覽器的請求也能包含瀏覽器宿主的住處和用戶端啟動並執行作業系統。實際的資訊內容將隨著瀏覽器的不同而有相應的變化,只有很少一部分能夠由其他的應用程式如搜尋引擎robot提供。為了更清楚地瞭解該資訊,下面是從IE 5.0發出的一個對頁面http://www.wrox.com/Store/
Download.asp的請求資訊:
7/8/99 10:27:16 Sent GET /Store/Download.asp HTTP/1.1 Accept: application/msword, application/vnd.ms-execl, application/vnd.ms- powerpoint, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x- comet, */* Accept-Language: en-us Encoding: gzip, deflate Referer: http://ww.wrox.com/main_menu.asp Cookie: VisitCount=2&LASTDATE=6%2F4%2F99+10%3A10%3A13+AM User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Host: 212.250.238.67 Connection: Keep-Alive |
從中可以看出,這些資訊中有關於使用者代理程式和使用者串連的細節(如預設的語言),也有能夠接受的檔案或應用程式的類型列表,這些都是MIME類型的,在後面將會見到更多。瀏覽器能夠接受幾種影像檔及多種Microsoft Office檔案類型。“標準”的檔案類型,如tesx/html和text/text沒有列在其中。檔案清單中*/*表示可向瀏覽器發回任何類型的檔案,由瀏覽器解釋或通過一個外掛程式(plug-in)應用程式來進行解釋。
cookie: 條目包含的cookie存放在用戶端的電腦上,並僅對該域有效。假如請求是點選連結的結果,而不是在瀏覽器的地址欄直接輸入URL,則Referer:條目被顯示出來,它包含了連結頁面的完整的URL。
Host:條目包含客戶電腦的IP地址或名稱。然而,這還不足以準確辨別客戶機。因為它們通過ISP串連時,IP地址是動態分配的,或者通過一個Proxy 伺服器串連時,IP地址是代理機的而不是實際的客戶機的。
2、伺服器響應的細節資訊
為響應上述的請求,並對匿名的瀏覽器(即使用者不必提供使用者名稱和訪問口令)提供請求的頁面,下面的內容是從伺服器發往客戶機的:
7/8/99 10:27:16 Received HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Connection: Keep-Alive Date: Thu, 8 Jul 1999 10:27:16 GMT Content-Type: text/html Accept-Ranges: bytes Content-Length: 2946 Last-Modified: Thu, 8 Jul 1999 10:27:16 GMT Cookie: VisitCount=3&LASTDATE=7%2F8%2F99+10%3A27%3A16+AM <HTML> … rest of page … </HTML> |
可以看出伺服器向用戶端說明自己所用的軟體及版本,第一行表明所使用的是HTTP協議,及返回碼的狀態。資訊“200 OK”表示請求被接受並得到了滿足。後面的資訊是被返回的頁面的細節,包括MIME類型(Content-Length:)、大小(位元組)、最近更改時間,和返回用戶端儲存的cookie。響應中的其他資訊是頁面內容的資訊流。
在某些情況下,伺服器響應一個請求後,不能返回一個頁面,也許因為頁面不存在,或都客戶沒有相應的許可權來訪問它。我們將在後面討論安全問題。現在,對於請求頁面不存在的情況(例如使用者在瀏覽器的地址欄輸入了錯誤的URL),返回的資訊開頭為:
7/8/99 14:27:16 Received HTTP/1.1 404 Not Found Server: Microsoft-IIS/5.0 … |
這裡,狀態代碼和資訊表明客戶請求的頁面無法找到。瀏覽器可使用這個資訊向使用者顯示相應的資訊(這種情況在IE 5.0中不顯示伺服器的響應資訊,而顯示相應“協助性”的錯誤提示頁面),也可顯示伺服器建立的預設頁面(依賴伺服器的設定)。 Request和Response對象
從ASP中能夠應用客戶請求和伺服器響應的細節是通過ASP內建的Request和Response對象來實現的。
· Request對象:為指令碼提供了當用戶端請求一個頁面或者傳遞一個表單時,用戶端提供的全部資訊。這包括能指明瀏覽器和使用者的HTTP變數,在這個網域名稱下存放在瀏覽器中的cookie,任何作為查詢字串而附於URL後面的字串或頁面的<FORM>段中的HTML控制項的值。也提供使用Secure Socket Layer(SSL)或其他加密通訊協定的授權訪問,及有助於對串連進行管理的屬性。
· Response對象:用來訪問伺服器端所建立的並發回到用戶端的響應資訊。為指令碼提供HTTP變數,指明伺服器和伺服器的功能和關於發回瀏覽器的內容的資訊,以及任何將為這個域而存放在瀏覽器裡新的cookie。它也提供了一系列的方法用來建立輸出,例如無處不在的Response.Write方法。
1、 Request對象成員的概述
a) Request對象的集合
Request對象提供了5個集合,可以用來訪問用戶端對Web伺服器請求的各類資訊,這些集合如下表:
Request對象的集合及說明
| 集合名稱 |
說明 |
| ClientCertificate |
當用戶端訪問一個頁面或其他資源時,用來向伺服器表明身份的客戶認證的所有欄位或條目的數值集合,每個成員均是唯讀 |
| Cookies |
根據使用者的請求,使用者系統發出的所有cookie的值的集合,這些cookie僅對相應的域有效,每個成員均為唯讀 |
| Form |
METHOD的屬性值為POST時,所有作為請求提交的<FORM>段中的HTML控制項單元的值的集合,每個成員均為唯讀 |
| QueryString |
依附於使用者請求的URL後面的名稱/數值對或者作為請求提交的且METHOD屬性為GET(或者省略其屬性)的,或<FORM>中所有HTML控制項單元的值,每個成員均為唯讀 |
| ServerVariables |
隨同用戶端請求發出的HTTP前序值,以及Web伺服器的幾種環境變數的值的集合,每個成員均為唯讀 |
b) Request對象的屬性
Request對象唯一的屬性及說明如下表所示,它提供使用者請求的位元組數量的資訊,它很少用於ASP頁,我們通常關注指定值而不是整個請求字串。
| 屬性 |
說明 |
| TotlBytes |
唯讀,返回由用戶端發出的請求的整個位元組數量 |
c) Request對象的方法
Request對象唯一的方法及說明如下表所示,它允許訪問從一個<FORM>段中傳遞給伺服器的使用者請求部分的完整內容。
Request對象的方法及說明
| 方法 |
說明 |
| BinaryRead(count) |
當資料作為POST請求的一部分發往伺服器時,從客戶請求中獲得count位元組的資料,返回一個Variant數組(或者SafeArray)。如果ASP代碼已經引用了Request.Form集合,這個方法就不能用。同時,如果用了BinaryRead方法,就不能訪問Request.Form集合 |
2、 Response對象成員概述
a) Response對象的集合
Response對象只有一個集合,如下表所示,該集合設定希望放置在客戶系統上的cookie的值,它直接等同於Request.Cookies集合。
Response對象的集合及說明
| 集合名稱 |
說明 |
| Cookies |
在當前響應中,發回用戶端的所有cookie的值,這個集合為唯寫 |
b) Response對象的屬性
Response對象也提供一系列的屬性,可以讀取(多數情況下)和修改,使響應能夠適應請求。這些由伺服器設定,我們不需要設定它們。需要注意的是,當設定某些屬性時,使用的文法可能與通常所使用的有一定的差異。
Response對象的屬性及說明
| 屬性 |
說明 |
| Buuffer=True|False |
讀/寫,布爾型,表明由一個ASP頁所建立的輸出是否一直存放在IIS緩衝區,直到當前頁面的所有伺服器指令碼處理完畢或Flush、End方法被調用。在任何輸出(包括HTTP報送資訊)送住IIS之前這個屬性必須設定。因此在.asp檔案中,這個設定應該在<%@LANGUAGE=…%>語句後面的第一行。ASP 3.0預設設定緩衝為開(True),而在早期版本中預設為關(False) |
| CacheControl”setting” |
讀/寫,字元型,設定這個屬性為“Public”允許Proxy 伺服器快取頁面面,如為“Private”則禁止Proxy 伺服器緩衝的發生 |
| Charset=”value” |
讀/寫,字元型,在由伺服器為每個響應建立的HTTP Content-Type前序中附上所用的字元集名稱(例如:ISO-LATIN-7) |
| Content Type=”MIME-type” |
讀/寫,字元型,指明響應的HTTP內容類型,標準的MIME類型(例如“text/XML”或者“Image/gif”)。假如預設,表示使用MIME類型“text/html”,內容類型告訴瀏覽器所期望內容的類型 |
| Expires minutes |
讀/寫,數值型,指明頁面有效以分計算的時間長度,假如使用者請求其有效期間滿之前的相同頁面,將直接讀取顯示緩衝中的內容,這個有效期間過後,頁面將不再保留在私人(使用者)或公用(Proxy 伺服器)緩衝中 |
| Expires Absolute #date [time]# |
讀/寫,日期/時間型,指明當一個頁面到期和不再有效時的絕對日期和時間 |
| IsClientConnected |
唯讀,布爾型,返回客戶是否仍然串連和下載頁面的狀態標誌。在當前的頁面已執行完畢之前,假如一個客戶轉移到別一個頁面,這個標誌可用來中止處理(使用Response.End方法) |
| PICS(“PICS-Label-string”) |
唯寫,字元型,建立一個PICS前序定義頁面內容中的詞彙等級,如暴力、性、不良語言等 |
| Status=”Code message” |
讀/寫,字元型,指明發回客戶的響應的HTTP前序中表明錯誤或頁面處理是否成功的狀態值和資訊。例如“200 OK”和“404 Not Found” |
c) Response對象的方法
Response對象提供一系列的方法,如下表所示,允許直接處理為返回給用戶端而建立的頁面內容。
Response對象的方法及說明
| 方法 |
說明 |
| AddHeader(“name”,”content”) |
通過使用name和Content值,建立一個定製的HTTP前序,並增加到響應之中。不能替換現有的相同名稱的前序。一旦已經增加了一個前序就不能被刪除。這個方法必須在任何頁面內容(即text和HTML)被發住用戶端前使用 |
| AppendToLog(“string”) |
當使用“W3C Extended Log File Format”檔案格式時,對於使用者請求的Web伺服器的記錄檔增加一個條目。至少要求在包含頁面的網站的“Extended Properties”頁中選擇“URL Stem” |
| BinaryWrite(safeArray) |
在當前的HTTP輸出資料流中寫入Variant類型的SafeArray,而不經過任何字元轉換。對於寫入非字串的資訊,例如定製的應用程式請求的位元據或組成影像檔的二進位位元組,是非常有用的 |
| Clear() |
當Response.Buffer為True時,從IIS響應緩衝中刪除現存的緩衝頁面內容。但不刪除HTTP響應的前序,可用來放棄部分完成的頁面 |
| End() |
讓ASP結束處理頁面的指令碼,並返回當前已建立的內容,然後放棄頁面的任何進一步處理 |
| Flush() |
發送IIS緩衝中所有當前緩衝頁給用戶端。當Response.Buffer為True時,可以用來發送較大頁面的部分內容給個別的使用者 |
| Redirect(“url”) |
通過在響應中發送一個“302 Object Moved”HTTP前序,指示瀏覽器根據字串url下載相應地址的頁面 |
| Write(“string”) |
在當前的HTTP響應資訊流和IIS緩衝區寫入指定的字元,使之成為返回頁面的一部分 |