Request和Response這兩個對象是ASP所提供的內(nèi)置對象中最常用的兩個,。在瀏覽器(或其他用戶代理)和Web服務(wù)器之間,請求與響應(yīng)中發(fā)生的信息交流可以通過ASP中的兩個內(nèi)置對象來進(jìn)行訪問和管理,,這兩個對象稱為Request和Response對象,。
在ASP頁中所要進(jìn)行的工作幾乎都要訪問這兩個對象,使用這兩個對象的方式將影響頁面的效率及可靠性,。當(dāng)然,它們的主要用途是訪問用戶發(fā)回到服務(wù)器的值,,即從HTML頁的<FORM>段獲得或附在URL后面作為查詢字符串,,并創(chuàng)建合適的輸出返回給用戶,且它們可以共享很多相同的因素,。例如兩個對象都可以使用存儲在客戶端計算機(jī)上的cookie,。
因此,我們把內(nèi)容分成兩個獨(dú)立的部分(每個對象一部分),,并且首先從客戶端與服務(wù)器這間的信息交流入手,,然后再研究每一個對象。
研究的內(nèi)容是:
· 客戶端與服務(wù)器如何交流以傳遞Web或其他資源,。
· Request和Response對象的細(xì)節(jié),,以及它們之間的共同點(diǎn)。
· 如何通過一個窗體和查詢字符串訪問相應(yīng)的值,。
· 如何讀入或創(chuàng)建cookie并存放在客戶端的計算機(jī)上,。
· 服務(wù)器的變量是什么?如何訪問和修改HTTP報頭,。
· 說明其他相關(guān)條目的變化,,如客戶的證書使用。
客戶端和服務(wù)器的交流 為節(jié)省篇幅,,后面的內(nèi)容中使用“瀏覽器”(browser)一詞,。但需要記住的是,能夠訪問Web頁面的應(yīng)用程序絕不僅只有瀏覽器,,有許多特殊的應(yīng)用程序從站點(diǎn)上下載網(wǎng)頁,,如為那些視力有缺陷用戶設(shè)計的特殊的客戶端程序或者是用通常的瀏覽器有其他困難的人。最顯而易見的例子是搜索引擎用來訪問Web上的站點(diǎn)的robot,。全面考慮這些因素,,包括普通的Web瀏覽器,準(zhǔn)確的詞匯應(yīng)該是用戶代理(user agent),。
頁面請求的對話 當(dāng)一個瀏覽器向Web站點(diǎn)提出頁面請求時,,顯然必須告訴服務(wù)器,其請求的是哪一個頁面。首先要做的是通過域名與服務(wù)器建立連接,,然后提供所請求的頁面的全路徑和名稱,。為什么要全路徑和名稱?Web是一個無國界的環(huán)境,,所以必須創(chuàng)造一個會話標(biāo)識每個客戶(將在以后介紹ASP如何做到這點(diǎn)),。
這就意味著每當(dāng)服務(wù)器完成向客戶發(fā)送頁面后,服務(wù)器就徹底忘記了這個客戶,。因此,,當(dāng)客戶請求下一個頁面時,與一個新的訪問者是完全相同的,。服務(wù)器無法記住這個客戶,,相應(yīng)的,也就無法判斷它們上次請求的頁面是哪一個,。因?yàn)?,不能使用相對路徑來提供一個頁面,即使頁面包含一個相對的鏈接也不行,,例如:
<A HREF=”Download.asp”>Next Page</A>
瀏覽器將自動建立完整的新頁面的URL,,方法是使用當(dāng)前頁的域和路徑;或使用頁面<HEAD>段中的<BASE>元素,,告訴瀏覽器一個頁面中所有鏈接的其URL是什么,。例如:
<BASE HERF=http://www./Store>
當(dāng)把鼠標(biāo)指向一個頁面的鏈接時,可在瀏覽器的狀態(tài)欄中看到,。當(dāng)前頁面的路徑和當(dāng)前域名或基域名或基路徑已經(jīng)與請求的頁面名結(jié)合在一起了,。
1、客戶請求的細(xì)節(jié)
所請求頁面的全路徑和名稱的組合是瀏覽器請求頁面時發(fā)住服務(wù)器的唯一住處瀏覽器的請求也能包含瀏覽器宿主的住處和客戶端運(yùn)行的操作系統(tǒng),。實(shí)際的信息內(nèi)容將隨著瀏覽器的不同而有相應(yīng)的變化,,只有很少一部分能夠由其他的應(yīng)用程序如搜索引擎robot提供。為了更清楚地了解該信息,,下面是從IE 5.0發(fā)出的一個對頁面http://www./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./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
從中可以看出,,這些信息中有關(guān)于用戶代理和用戶連接的細(xì)節(jié)(如缺省的語言),也有能夠接受的文件或應(yīng)用程序的類型列表,,這些都是MIME類型的,,在后面將會見到更多。瀏覽器能夠接受幾種圖像文件及多種Microsoft Office文件類型,。“標(biāo)準(zhǔn)”的文件類型,,如tesx/html和text/text沒有列在其中。文件列表中*/*表示可向?yàn)g覽器發(fā)回任何類型的文件,,由瀏覽器解釋或通過一個插件(plug-in)應(yīng)用程序來進(jìn)行解釋,。
cookie: 條目包含的cookie存放在客戶端的計算機(jī)上,,并僅對該域有效。假如請求是點(diǎn)擊鏈接的結(jié)果,,而不是在瀏覽器的地址欄直接輸入URL,,則Referer:條目被顯示出來,它包含了鏈接頁面的完整的URL,。
Host:條目包含客戶計算機(jī)的IP地址或名稱,。然而,這還不足以準(zhǔn)確辨別客戶機(jī),。因?yàn)樗鼈兺ㄟ^ISP連接時,,IP地址是動態(tài)分配的,或者通過一個代理服務(wù)器連接時,,IP地址是代理機(jī)的而不是實(shí)際的客戶機(jī)的,。
2、服務(wù)器響應(yīng)的細(xì)節(jié)信息
為響應(yīng)上述的請求,,并對匿名的瀏覽器(即用戶不必提供用戶名和訪問口令)提供請求的頁面,下面的內(nèi)容是從服務(wù)器發(fā)往客戶機(jī)的:
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>
可以看出服務(wù)器向客戶端說明自己所用的軟件及版本,,第一行表明所使用的是HTTP協(xié)議,,及返回碼的狀態(tài)。信息“200 OK”表示請求被接受并得到了滿足,。后面的信息是被返回的頁面的細(xì)節(jié),,包括MIME類型(Content-Length:)、大?。ㄗ止?jié)),、最近更改時間,和返回客戶端存儲的cookie,。響應(yīng)中的其他信息是頁面內(nèi)容的信息流,。
在某些情況下,服務(wù)器響應(yīng)一個請求后,,不能返回一個頁面,,也許因?yàn)轫撁娌淮嬖冢蚨伎蛻魶]有相應(yīng)的權(quán)限來訪問它,。我們將在后面討論安全問題?,F(xiàn)在,對于請求頁面不存在的情況(例如用戶在瀏覽器的地址欄輸入了錯誤的URL),,返回的信息開頭為:
7/8/99 14:27:16 Received HTTP/1.1 404 Not Found
Server: Microsoft-IIS/5.0
…
這里,,狀態(tài)碼和信息表明客戶請求的頁面無法找到。瀏覽器可使用這個信息向用戶顯示相應(yīng)的信息(這種情況在IE 5.0中不顯示服務(wù)器的響應(yīng)信息,,而顯示相應(yīng)“幫助性”的錯誤提示頁面),,也可顯示服務(wù)器創(chuàng)建的缺省頁面(依賴服務(wù)器的設(shè)置),。 Request和Response對象
從ASP中能夠應(yīng)用客戶請求和服務(wù)器響應(yīng)的細(xì)節(jié)是通過ASP內(nèi)置的Request和Response對象來實(shí)現(xiàn)的。
· Request對象:為腳本提供了當(dāng)客戶端請求一個頁面或者傳遞一個窗體時,,客戶端提供的全部信息,。這包括能指明瀏覽器和用戶的HTTP變量,在這個域名下存放在瀏覽器中的cookie,,任何作為查詢字符串而附于URL后面的字符串或頁面的<FORM>段中的HTML控件的值,。也提供使用Secure Socket Layer(SSL)或其他加密通信協(xié)議的授權(quán)訪問,及有助于對連接進(jìn)行管理的屬性,。
· Response對象:用來訪問服務(wù)器端所創(chuàng)建的并發(fā)回到客戶端的響應(yīng)信息,。為腳本提供HTTP變量,指明服務(wù)器和服務(wù)器的功能和關(guān)于發(fā)回瀏覽器的內(nèi)容的信息,,以及任何將為這個域而存放在瀏覽器里新的cookie,。它也提供了一系列的方法用來創(chuàng)建輸出,例如無處不在的Response.Write方法,。
1,、 Request對象成員的概述
a) Request對象的集合
Request對象提供了5個集合,可以用來訪問客戶端對Web服務(wù)器請求的各類信息,,這些集合如下表:
Request對象的集合及說明
集合名稱 |
說明 |
ClientCertificate |
當(dāng)客戶端訪問一個頁面或其他資源時,,用來向服務(wù)器表明身份的客戶證書的所有字段或條目的數(shù)值集合,每個成員均是只讀 |
Cookies |
根據(jù)用戶的請求,,用戶系統(tǒng)發(fā)出的所有cookie的值的集合,,這些cookie僅對相應(yīng)的域有效,每個成員均為只讀 |
Form |
METHOD的屬性值為POST時,,所有作為請求提交的<FORM>段中的HTML控件單元的值的集合,,每個成員均為只讀 |
QueryString |
依附于用戶請求的URL后面的名稱/數(shù)值對或者作為請求提交的且METHOD屬性為GET(或者省略其屬性)的,或<FORM>中所有HTML控件單元的值,,每個成員均為只讀 |
ServerVariables |
隨同客戶端請求發(fā)出的HTTP報頭值,,以及Web服務(wù)器的幾種環(huán)境變量的值的集合,每個成員均為只讀 |
b) Request對象的屬性
Request對象唯一的屬性及說明如下表所示,,它提供用戶請求的字節(jié)數(shù)量的信息,,它很少用于ASP頁,我們通常關(guān)注指定值而不是整個請求字符串,。
屬性 |
說明 |
TotlBytes |
只讀,,返回由客戶端發(fā)出的請求的整個字節(jié)數(shù)量 |
c) Request對象的方法
Request對象唯一的方法及說明如下表所示,它允許訪問從一個<FORM>段中傳遞給服務(wù)器的用戶請求部分的完整內(nèi)容,。
Request對象的方法及說明
方法 |
說明 |
BinaryRead(count) |
當(dāng)數(shù)據(jù)作為POST請求的一部分發(fā)往服務(wù)器時,,從客戶請求中獲得count字節(jié)的數(shù)據(jù),返回一個Variant數(shù)組(或者SafeArray),。如果ASP代碼已經(jīng)引用了Request.Form集合,,這個方法就不能用,。同時,如果用了BinaryRead方法,,就不能訪問Request.Form集合 |
2,、 Response對象成員概述
a) Response對象的集合
Response對象只有一個集合,如下表所示,,該集合設(shè)置希望放置在客戶系統(tǒng)上的cookie的值,,它直接等同于Request.Cookies集合。
Response對象的集合及說明
集合名稱 |
說明 |
Cookies |
在當(dāng)前響應(yīng)中,,發(fā)回客戶端的所有cookie的值,,這個集合為只寫 |
b) Response對象的屬性
Response對象也提供一系列的屬性,可以讀?。ǘ鄶?shù)情況下)和修改,,使響應(yīng)能夠適應(yīng)請求。這些由服務(wù)器設(shè)置,,我們不需要設(shè)置它們,。需要注意的是,當(dāng)設(shè)置某些屬性時,,使用的語法可能與通常所使用的有一定的差異,。
Response對象的屬性及說明
屬性 |
說明 |
Buuffer=True|False |
讀/寫,布爾型,,表明由一個ASP頁所創(chuàng)建的輸出是否一直存放在IIS緩沖區(qū),直到當(dāng)前頁面的所有服務(wù)器腳本處理完畢或Flush,、End方法被調(diào)用,。在任何輸出(包括HTTP報送信息)送住IIS之前這個屬性必須設(shè)置。因此在.asp文件中,,這個設(shè)置應(yīng)該在<%@LANGUAGE=…%>語句后面的第一行,。ASP 3.0缺省設(shè)置緩沖為開(True),而在早期版本中缺省為關(guān)(False) |
CacheControl”setting” |
讀/寫,,字符型,,設(shè)置這個屬性為“Public”允許代理服務(wù)器緩存頁面,如為“Private”則禁止代理服務(wù)器緩存的發(fā)生 |
Charset=”value” |
讀/寫,,字符型,,在由服務(wù)器為每個響應(yīng)創(chuàng)建的HTTP Content-Type報頭中附上所用的字符集名稱(例如:ISO-LATIN-7) |
Content Type=”MIME-type” |
讀/寫,字符型,,指明響應(yīng)的HTTP內(nèi)容類型,,標(biāo)準(zhǔn)的MIME類型(例如“text/xml”或者“Image/gif”)。假如缺省,,表示使用MIME類型“text/html”,,內(nèi)容類型告訴瀏覽器所期望內(nèi)容的類型 |
Expires minutes |
讀/寫,,數(shù)值型,指明頁面有效的以分鐘計算的時間長度,,假如用戶請求其有效期滿之前的相同頁面,,將直接讀取顯示緩沖中的內(nèi)容,這個有效期間過后,,頁面將不再保留在私有(用戶)或公用(代理服務(wù)器)緩沖中 |
Expires Absolute #date [time]# |
讀/寫,,日期/時間型,指明當(dāng)一個頁面過期和不再有效時的絕對日期和時間 |
IsClientConnected |
只讀,,布爾型,,返回客戶是否仍然連接和下載頁面的狀態(tài)標(biāo)志。在當(dāng)前的頁面已執(zhí)行完畢之前,,假如一個客戶轉(zhuǎn)移到別一個頁面,,這個標(biāo)志可用來中止處理(使用Response.End方法) |
PICS(“PICS-Label-string”) |
只寫,字符型,,創(chuàng)建一個PICS報頭定義頁面內(nèi)容中的詞匯等級,,如暴力、性,、不良語言等 |
Status=”Code message” |
讀/寫,,字符型,指明發(fā)回客戶的響應(yīng)的HTTP報頭中表明錯誤或頁面處理是否成功的狀態(tài)值和信息,。例如“200 OK”和“404 Not Found” |
c) Response對象的方法
Response對象提供一系列的方法,,如下表所示,允許直接處理為返回給客戶端而創(chuàng)建的頁面內(nèi)容,。
Response對象的方法及說明
方法 |
說明 |
AddHeader(“name”,”content”) |
通過使用name和Content值,,創(chuàng)建一個定制的HTTP報頭,并增加到響應(yīng)之中,。不能替換現(xiàn)有的相同名稱的報頭,。一旦已經(jīng)增加了一個報頭就不能被刪除。這個方法必須在任何頁面內(nèi)容(即text和HTML)被發(fā)住客戶端前使用 |
AppendToLog(“string”) |
當(dāng)使用“W3C Extended Log File Format”文件格式時,,對于用戶請求的Web服務(wù)器的日志文件增加一個條目,。至少要求在包含頁面的站點(diǎn)的“Extended Properties”頁中選擇“URL Stem” |
BinaryWrite(safeArray) |
在當(dāng)前的HTTP輸出流中寫入Variant類型的SafeArray,而不經(jīng)過任何字符轉(zhuǎn)換,。對于寫入非字符串的信息,,例如定制的應(yīng)用程序請求的二進(jìn)制數(shù)據(jù)或組成圖像文件的二進(jìn)制字節(jié),是非常有用的 |
Clear() |
當(dāng)Response.Buffer為True時,,從IIS響應(yīng)緩沖中刪除現(xiàn)存的緩沖頁面內(nèi)容,。但不刪除HTTP響應(yīng)的報頭,可用來放棄部分完成的頁面 |
End() |
讓ASP結(jié)束處理頁面的腳本,,并返回當(dāng)前已創(chuàng)建的內(nèi)容,,然后放棄頁面的任何進(jìn)一步處理 |
Flush() |
發(fā)送IIS緩沖中所有當(dāng)前緩沖頁給客戶端,。當(dāng)Response.Buffer為True時,可以用來發(fā)送較大頁面的部分內(nèi)容給個別的用戶 |
Redirect(“url”) |
通過在響應(yīng)中發(fā)送一個“302 Object Moved”HTTP報頭,,指示瀏覽器根據(jù)字符串url下載相應(yīng)地址的頁面 |
Write(“string”) |
在當(dāng)前的HTTP響應(yīng)信息流和IIS緩沖區(qū)寫入指定的字符,,使之成為返回頁面的一部分 |