這兩個對象是ASP所提供的內置對象中最常用的兩個。在浏覽器(或其他用戶代理)和Web服務器之間,請求與響應中發生的信息交流可以通過ASP中的兩個內置對象來進行訪問和管理,這兩個對象稱為Request和Response對象。
在ASP頁中所要進行的工作幾乎都要訪問這兩個對象,使用這兩個對象的方式將影響頁面的效率及可靠性。當然,它們的主要用途是訪問用戶發回到服務器的值,即從Html頁的<FORM>段獲得或附在URL後面作為查詢字符串,並創建合適的輸出返回給用戶,且它們可以共享很多相同的因素。例如兩個對象都可以使用存儲在客戶端計算機上的cookIE。
客戶端和服務器的交流
為節省篇幅,後面的內容中使用“浏覽器”(browser)一詞。但需要記住的是,能夠訪問Web頁面的應用程序絕不僅只有浏覽器,有許多特殊的應用程序從站點上下載網頁,如為那些視力有缺陷用戶設計的特殊的客戶端程序或者是用通常的浏覽器有其他困難的人。最顯而易見的例子是搜索引擎用來訪問Web上的站點的 robot。全面考慮這些因素,包括普通的Web浏覽器,准確的詞匯應該是用戶代理(user agent)。
頁面請求的對話
當一個浏覽器向Web站點提出頁面請求時,顯然必須告訴服務器,其請求的是哪一個頁面。首先要做的是通過域名與服務器建立連接,然後提供所請求的頁面的全路徑和名稱。為什麼要全路徑和名稱?Web是一個無國界的環境,所以必須創造一個會話標識每個客戶。
這就意味著每當服務器完成向客戶發送頁面後,服務器就徹底忘記了這個客戶。因此,當客戶請求下一個頁面時,與一個新的訪問者是完全相同的。服務器無法記住這個客戶,相應的,也就無法判斷它們上次請求的頁面是哪一個。因為,不能使用相對路徑來提供一個頁面,即使頁面包含一個相對的鏈接也不行,例如:
<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地址是動態分配的,或者通過一個代理服務器連接時,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方法。
<h3> Request對象成員的概述 </h3>
一 Request對象的集合
語法:
Response.collection|property|method
Request對象提供了5個集合,可以用來訪問客戶端對Web服務器請求的各類信息。
ClIEntCertificate
當客戶端訪問一個頁面或其他資源時,用來向服務器表明身份的客戶證書的所有字段或條目的數值集合,每個成員均是只讀
CookIEs
根據用戶的請求,用戶系統發出的所有cookie的值的集合,這些cookIE僅對相應的域有效,每個成員均為只讀
Form
METHOD的屬性值為POST時,所有作為請求提交的<FORM>段中的Html控件單元的值的集合,每個成員均為只讀
QueryString
依附於用戶請求的URL後面的名稱/數值對或者作為請求提交的且METHOD屬性為GET(或者省略其屬性)的,或<FORM> 中所有Html控件單元的值,每個成員均為只讀
ServerVariables
隨同客戶端請求發出的HTTP報頭值,以及Web服務器的幾種環境變量的值的集合,每個成員均為只讀
二 Request對象的屬性
Request對象唯一的屬性及說明如下表所示,它提供用戶請求的字節數量的信息,它很少用於ASP頁,我們通常關注指定值而不是整個請求字符串。
TotlBytes
只讀,返回由客戶端發出的請求的整個字節數量
三 Request對象的方法
Request對象唯一的方法及說明如下表所示,它允許訪問從一個<FORM>段中傳遞給服務器的用戶請求部分的完整內容。
BinaryRead(count)
當數據作為POST請求的一部分發往服務器時,從客戶請求中獲得count字節的數據,返回一個Variant數組(或者 SafeArray)。如果ASP代碼已經引用了Request.Form集合,這個方法就不能用。同時,如果用了BinaryRead方法,就不能訪問Request.Form集合
<h3> Response對象成員概述</h3>
語法:
Response.collection|property|method
一、集合
Response對象只有一個集合--Cookies,CookIEs數據集合允許將數據設置在客戶端的浏覽器中。若指定的cookIE不存在,則創建它。若存在,則自動更新數據。
語法:Response.Cookies(CookIE)[Key.Attribute]
這裡的cookie是指定cookie的名稱。而如果指定了key,則該cookie就是一個字典。attribute指定cookIE自身的有關信息。attribute參數可以是下列之一:
Domain只寫。若被指定,則cookIE將被發送到對該域的請求中去。
Expires只寫。指定cookie的過期日期。為了在會話結束後將cookIE存儲在客戶端磁盤上,必須設置該日期。若此項屬性的設置未超過當前日期,則在任務結束後cookIE將到期。
HasKeys只讀。指定cookIE是否包含關鍵字。
Path只寫。若被指定,則cookIE將只發送到對該路徑的請求中。如果未設置該屬性,則使用應用程序的路徑。
Secure只寫。指定CookIE是否安全。
二、方法
Response.AddHeaderName,Value
向應答中添加一個新的HTML標題。Name為新HTML標題的名稱。Value為該頭變量的值。你可以添加任何名稱和任何值的Html標題。它並不替代現有的同名標題。一旦標題被添加,將不能刪除。
Response.AppendToLogString
向Web服務器的日志條目的末尾添加一字符串。String為要添加到日志文件中的字符串。
Response.BinaryWriteData
該方法可以不經任何字符轉換就將制定的信息寫到HTTP輸出,主要用於寫非字符串信息(如客戶端應用程序所需的二進制數據等)。Data是要發送的數據。
Response.Clear
刪除緩沖區的所有Html輸出,但只刪除響應正文而不刪除響應標題。可以用該方法處理錯誤情況。需要注意的是,如果Response.Buffer設置為True,則該方法將導致運行是錯誤。
Response.End
強迫Web服務器停止執行更多的腳本,並發送當前結果,文件中剩余的內容將不被處理。如果Response.Buffer設置為True,則調用Response.end將緩沖輸出。
Response.Flush
對於一個緩沖的回應,發送所有的緩沖信息。如果Response.Buffer設置為True,則該方法將導致運行是錯誤。
Response.RedirectURL
將客戶端的浏覽器重定向到一個新的Internet地址。Url為新網頁的Internet地址。
Response.WriteVariant
Response.Write是Response對象最常用的方法,該方法可以向浏覽器發送字符串。Variant是一字符串或一個具有字符串值的變量。
三、屬性
Response.Buffer
緩沖一ActiveServerPage。回應只到某一頁結束或Response.Flush或Response.End方法調用時才發送出去。服務器將輸出送給客戶端後就不能再設置Buffer屬性。
Response.CacheControl
指明是否Proxy服務器能緩存ActiveServerPage。缺省時,其值為FALSE。當設置其屬性為Public時,Proxy服務器可以緩沖由ASP產生的輸出。
Response.CharSet(Charsetname)
將字符集名稱(如GB)附加到Response對象中content-type標題的後面,用來設置web服務器響應給客戶端的文件字符編碼。一個可能的值為“ISO_LATIN_1”。
Response.ContentType
指明回應內容的類型。可能的值為text/plain和image/GIF,默認值text/Html。
Response.Expires
浏覽器可以緩存當前頁的時間長度,以分鐘為單位。
Response.ExpiresAbsolute
浏覽器不能再緩存當前頁的日期和時間。在未到期之前,可以返回。如果未指定時間,該主頁在當天午夜到期;如果未指定日期,則到當天指定時間到期。
True/False=Response.IsClIEntConnected
屬性為只讀,指明自上次調用Response.Write之後,客戶端是否仍然和服務器連接。該屬性允許用戶在客戶端和服務器沒有聯接的情況下有更多的控制。例如,在從客戶端提出請求起到服務器做出相應,其間要用去很長一段時間的情況下,這就可能有助於確保在繼續處理腳本之前客戶端仍是連通的。具有值 TRUE或FALSE。
Response.PICS(PICS字符串)
用於添加網頁的PICS等級。PICS級別指明某一網頁的內容級別,比如暴力或色情的程度等。
Response.Status="狀態描述字符串"
用來設置Web服務器要響應的狀態行的值。