java2平臺安全技術-結構,api設計和實現-asp3高級編程_第1頁
java2平臺安全技術-結構,api設計和實現-asp3高級編程_第2頁
java2平臺安全技術-結構,api設計和實現-asp3高級編程_第3頁
java2平臺安全技術-結構,api設計和實現-asp3高級編程_第4頁
java2平臺安全技術-結構,api設計和實現-asp3高級編程_第5頁
免費預覽已結束,剩余32頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2 上一章介紹了安裝設置的一些基本問題和ASP的使用,以及其所提供的內置對象。本章將進一步研究兩個最常用的對象。在瀏覽器(或其他用戶)和Web服務器之間,請求與響應中發生的信息交流可以通過ASP中的兩個內置對象來進行和管理,這兩個對象稱為在ASP頁中所要進行的工作幾乎都要這兩個對象,使用這兩個對象的方式將影響頁面的效率及可靠性。當然,它們的主要用途是用戶發回到服務器的值,即從HTML頁的<FORM>段獲得或附在URL后面作為查詢字符串,并創建合適的輸出返回給用戶,且它們可以享多同因例兩對都使在戶計機的 。(每個對象一部分),并且首先從客戶端與服務器之如何讀入或創 服務器的變量是什么?如何和修改HTTP報頭首先看一下客戶瀏覽器(或“用戶”)和ASP的Web服務器之間交流的情況當瀏覽器或其他的用戶eb站點請求頁面時,在客戶服務器和eb服務器之間就產生了一個,仔細研究這個問題,因為理解這個問題有助于掌握使用ASPReqet和epone對象的基本知識,進而才能進一步掌握的知。住的是,能夠Web頁面的應用程序絕不僅只有瀏覽器,有許多特殊的應用程序從站點上網頁,如為那些視力有缺陷用戶設計的特殊的客戶端程序或者是用通常的瀏面考慮這些因素,包括普通的Web瀏覽器,準確的詞匯應該是用戶(useragent)。當一個瀏覽器向eb站點提出頁面請求時,顯然必須告訴服務器,其請求的是哪一個頁面。首先要做的是通過與服務器建立連接,然后提供所請求頁面的全路徑和名稱。為什e(一章介紹ASP如何做到這點)這就意味著每當服務器完成向客戶發送頁面后,服務器就徹底忘記了這個客戶。因此,當客戶請求下一個頁面時,與一個新的者是完全相同的。服務器無法記住這個客戶,相應的,也就無法判斷它們上次請求的頁面是哪一個。因此,不能使用相對路徑來提供一個頁面,即使頁面包含一個相對的也不行,例如:瀏覽器將自動建立完整的新頁面的URL<HEAD>段中的<BASE>元素,告訴瀏覽器一個頁面中所有的基URL是什么。例如當把鼠標指向一個頁面的時,可在瀏覽器的狀態欄中看到如圖2-1所示的情況。當前頁面的路徑和當前或基已經與請求的頁面名結合在

所請求頁面的全路徑和名稱的組合是瀏覽器請求頁面時發往服務器的唯一信息。瀏覽器的請求也能包含瀏覽器宿主的信息和客戶端運行的操作系統。實際的信息內容將隨著瀏覽器的不同有相的變,只很少部分夠由他應用程如搜引擎robot提供。為了更清楚地了解該信息,下面是從IE5.0發出的一個對頁面http:// .com/StoreDownload.asp的請求信息:從中以出這信中關用和戶的細節(如缺省的語言),也能夠接受的文件或應用程序類型列表,這些是MIME類型的,在后面將會見到。瀏覽器能夠接受幾種圖像文件及多種 Office如text/html和text/text沒有列在其中。文件列表中*/*表示可向瀏覽器發回任何類型的文件,由瀏覽器解釋或通過一個插件(plug-in)應用程序來進行解釋。:條目包含的存放在客戶端的計算機上,并僅對該域有效。假如請求是點擊的結果,而不是在瀏覽器的地址欄直接輸入URL,則Referer:條目被顯示,它包含了鏈因為它們通過ISP連接時,IP地址是動態分配的,或者通過一個服務器連接時,為響應上述的請求,并對的瀏覽器(即用戶不必提供用戶名和口令)提供請求的可以看出服務器向客戶端說明自己所用的軟件及版本,第一行表明所使用的是HTTP及返回碼的狀態。信息“200OK”表示請求被接受并得到了滿足。后面的信息是被返回的頁面的細節,包括MIME類型(Content-Length:)、大小(字節)、最近更改的時間,和返回客戶端的。響應中的其他信息是頁面內容的信息流。在某些情況下,服務器響應一個請求后,不能返回一個頁面,也許因為頁面不存在,或者客戶沒有相應權限來它。在本書后續章節討論安全問題。現在,對于請求頁面不存在的情況(例如用戶在瀏覽器的地址欄輸入了錯誤的URL),返回的信息開頭為:這里,狀態碼和信息表明客戶請求的頁面無法找到。瀏覽器可使用這個信息向用戶顯示相應的信息(這種情況在IE5.0中不顯示服務器的響應信息,而顯示相應“幫助性”的錯誤提示頁面),也可顯示服務器創建的缺省頁面(依賴于服務器的設置)。至此,我們已經看到了客戶機與服務器交互作用中的一些細節,下面介紹ASP對象Request和Response在ASP中能夠應用客戶請求和服務器響應的細節是通過ASP內置的Request和Response對Request對象:為提供了當客戶端請求一個頁面或者傳遞一個窗體時,客戶端提供的全部信息。這包括能明瀏覽器和用戶的HTTP變量,在這個下存放在瀏覽器中的 ,任何作為查詢字符串而附于URL后面的字符串或頁面的<FORM>段中的HTMLecureSocketLayer(SL)或其他加密通信協議的,及有助于對連接進行管理的屬性。Response對象:用來服務器端所創建的并發回到客戶端的響應信息。為提供HTTP變量,指明服務器和服務器的功能和關于發回瀏覽器的內容的信息以及任何將為這個域而存放在瀏覽器里新的。它也提供了一系列的方法用來創建輸出,例如無處不在的Repone.rit方法。在這一節中,首先概述Request和Response對象的成員,然后繼續探討如何使用它們完成創建任務,以及如何使用每個對象的成員的細節。RequestRequest對象提供了5個集合,可以用來客戶端對Web服務器請求的各類信息,這些集表2- 集合名 Client當客戶端一個頁面或其他資源時,用來向服務器表明的客戶的所s 根據用戶的請求,用戶系統發出的所有的值的集合,這些僅對相應的域有效,每個成員均為只讀m HOD的屬性值為OS時,所有作為請求提交的<OR>段中的HL控QueryString 依附于用戶請求的URL后面的名稱/數值對或者作為請求提交的且METHOD屬性值為GET(或者省略其屬性)的,或<FORM>中所有HTML控件單元的值,每個成員均為只讀evrVras 隨同客戶端請求發出的HTP報頭值,以及eb服務器的幾種環境變量的值的集合,每個成員均為只讀Request2-2所示,它提供關于用戶請求的字節數量的信息,它很表2- 只讀,返回由客戶端發出的請求的整個字節Request對象唯一的方法及說明如表2-3所示,它允許從一個<FORM>段中傳遞給服務表2- BinaryRead(coun) 當數據作為POST請求的一部分發往服務器時,從客戶請求中獲得count字節的數據,返回一個ariant數組(或者SafeArray)。如果ASP代碼已經了Request.Form集合,這個方法就不能用。同樣,如果用了 BinaryRead方法,就不能Request.Form集合ResponseResponse對象只有一個集合,如表2-4所示,該集合設置希望放置在客戶系統上的 表2- 集合名 在當前響應中,發回客戶端的所 的值,這個集合為只Response對象也提供一系列的屬性,可以(多數情況下)和修改,響應能夠適應請。這些由服務器設置,我們不需要設置它們。需要注意的是,當設置某些屬性時,使用的語法2-5所示。表2- 讀/寫,布爾型,表明由一個ASP頁所創建的輸出是否一直存放在IIS直到當前頁面的所有服務器處理完畢或Flush、End方法被調用。在任何輸出(包括HTTP報頭信息)送往IIS之前這個屬性必須設置。因此在.asp文件中,這個設置應該在<%@LANGUAGE=...%>語句后面的第一行。ASP3.0缺省設置緩沖為開(rue),而在早期版本中缺省為關(False)CacheConrol"seg" /寫,字符型,設置這個屬性為“ Publc”允許服務器緩存頁面,如為“Prvae”則 服務器緩存的發生。 讀/寫,字符型,在由服務器為每個響應創HTTPContent-Type報頭中附上所用的字符集名稱(例如ISO-LATIN-7)ContentType="MIME- 讀/寫,字符型,指明響應的HTTP內容類型,標準的MIME類型(“exxml”或者“Imagegf”)。假如省略,表示使用IM類型“exhml”,xpresmues 讀寫,數值型,指明頁面有效的以分鐘計算的時間長度,假如用戶請求其有效期滿之前的相同頁面,將直接顯示緩沖中的內容,這個有效期間過后,頁面將不再保留在私有(用戶)或公用(服務器)緩沖中ExpiresAbsolute 讀/寫,日期/時間型,指明當一個頁面過期和不再有效時的絕對日期和時 只讀,布爾型,返回客戶是否仍然連接和頁面的狀態標志。在當前頁面已執行完畢之前,假如一個客戶轉移到另一個頁面,這個標志可用來中止處理(使用Response.End方法)PICS("PICS-Label- 只寫,字符型,創建一個PICS報頭并將之加到響應中的HTTP報頭PICS報頭定義頁面內容中的詞匯等級,如、性、不良語言Status="Code 讀/寫,字符型,指明發回客戶的響應的HTTP報頭中表明錯誤或頁面處是否成功的狀態值和信息200OK”和“404Not最后,Response對象提供一系列的方法,如表2-6所示,允許直接處理為返給客戶端而創表2- 通過使用name和Content值,創建一個定制的HTTP報頭,并增加中。不能替換現有的相同名稱的報頭。一旦已經增加了一個報頭就不能被刪除。這個方法必須在任何頁面內容(即text和HTML)被發往客戶端前使用 當使W3CExtendedLogFileFormat”文件格式時,對于用戶請求Web服務器的日志文件增加一個條目至少要求在包含頁面的站點的“ExtendedProperties”頁中選擇“URIStem” 在當前的HTTP輸出流中寫入Variant類型的SafeArray,而不經過任何轉換。對于寫入非字符串的信息,例如定制的應用程序請求的二進制數據或組成圖像文件的二進制字節,是非常有用的

(續Car 當ResponseBuffer為rue時,從II響應緩沖中刪除現存的緩沖頁面內容。但不刪除HP響應的報頭,可用來放棄部分完成的頁面End() 讓ASP結束處理頁面的,并返回當前已創建的內容,然后放棄頁面的任何進一步處理uh 發送IIS緩沖中所有當前緩沖頁給客戶端。當Responsebuffer為rue時,可Rdecr) 通過在響應中發送一個“302Obectoved”H報頭,指示瀏覽器根據字符串url相應地址的頁面rsrg) 在當前的HTP響應信息流和II緩沖區寫入指定的字符,使之成為返回頁Request和Response對象提供的屬性、方法和集合。在從WroxWeb站點 使用Form和QueryString當用戶填寫頁面<FORM>內容時所提供的全部值,或在瀏覽器地址欄輸入在URL后的值,通過Form和QueryString集合為ASP所用。這是在ASP代碼中值的一種簡單方法。ASP大多數ASP集合與在VB中見到的普通集合相差不多。實際上,它們是值的數組,但能通過使用一個文本字符串鍵(對大小寫不敏感)以及一個整型索引進行。因此,假如客戶端eb頁面包含的<FORM>如下:可通過ASP的Form集合來其控件內的值也可使用窗體中控件的整型索引,索引的范圍從在HTML中第一個定義的控件開始,然HTML中的控件發生了變化,或者插入一個新的控件,則ASP代碼將得到錯誤的值。進一步而言,對于閱讀代碼的人來講,極容易。可以通過集合把整個Form上的一系列值變成單個的字符變量,且不用提供鍵或索引。(=控件值),并且每一對名稱/值相互之間是用符號“&”相分隔的。假如打算把窗體中的內容傳遞單獨的希望得到值的標準格式的可執行應用程序或DLL,這個技術是很有用的。然而,一般說來,都是通過以窗體中控件名稱為文本鍵來集合中的內容。遍歷一個ASP有兩種方式遍歷一個ASP集合中的所有成員,方式與普通VB集合的基本相同。每個集合提供一個Count屬性,返回的是集合中條目數量。可通過使用一個整型索引使用count屬性來然而,更好的方法是使用ForEach...Next結構。 注意,一些瀏覽器返回到ASP的<FORM>值可ASPHTML定義中有在FormOtherHobby”創建一個條目。然而,它將包括從三個文本框中得到的值。假如在提交時,用戶留下了一個或多個為空,則返回的值為空字符串。假如用戶在第一和第三個文本框分別輸入Gardening和Mountaineering,第二個文本框為空,在我們的ASP代碼中Requet.orm(“OtherHobby”),將返回字符串: 對于前面的包含三個OtherHobby控件的窗體實例HTML中的單選或選項按扭控件在HTML中,需要給幾個控件相同的Name屬性的情況是單選(或選項)按鈕瀏覽器只能發送所選擇控件的值。因此,假如這個窗體的用戶已經選擇了“Europe”,將得到假如省略了VALUE屬性,瀏覽器將返回的值為“on”,因此將得到:VALUEHTML當一個窗體中HTML源碼包含一個復選框控件時,一般都給定唯一的名稱,例如: (加標記),遍歷如果除第三個復選框外,全部提交,在Request.Form集合假如編寫更復雜一些集合遍歷代碼,如先前所述需要注意的是兩種情況,沒有選中的控件根本不返回任何值。在第一種情況的結果里,沒有期騙性的逗號,第二種情況也沒有空值。這與上述的使用文本框的相當的測試的結果不一樣。使用文本框時,每個文本框都返回一個值,即使是一個空字符串。這是瀏覽器造成這樣的結果。因此在ASP代碼中集合時,要注意這個問題。上述情況一個棘手的負作用是使用復選框時,復選框值的索引與在原始的HTML中控件的位置沒有任何聯系,在上述的例子中第四個復選框的子鍵數為3,因為當窗HTML下列的窗體創建了包含5個值可供用戶選擇,由于包含了MULTIPLE屬性,因此可以通過選擇 假如使用更加復雜一些的集合遍歷代碼(單獨顯示每個子鍵)SELECT列表是一列復選然而,列表框也有指定的值,假如在<OPTION>標記中設置VALUE屬性,將得到的是選擇Request.Form集將包含這樣一個項目:如果沒有提供VALUE這允許既可以缺省(即無VALUE顯示選項文本,也可做相應的改變。后一種情況在某些情況下是極為有用的,如要顯示一個說明的字符串)和傳遞一個完全不同的內容(如用一個短碼代表一個說明性的字符串)。HTML復選框和單選框是布爾型控件的例子,選中或選擇返回的為“on”,不像文本框和大多數還有另外一種常用的布爾型控件,稱為HTML按鈕。如<INPUTTYPE=“SUBMIT”><INPUTTYPE=“RESET”>、<INPUTTYPE=“IMAGE”>、<INPUT>和<BUTTON>...</BUTTON>BUTTON類型的控件不返回任何值,因其對窗體沒有直接的影響。即使使用用來調用窗體的Submit方法,瀏覽器在任何請求中將不包含BUTTON類型控件的值。同樣,一個<INPUTTYPE=“RESET”>按鈕的值也決不然而,輸入按鈕控件BT和IE類型實際提交窗體給服務器,其LE屬性包含窗體的其他控件的值(只要在TL定義中包含一個E屬性)。例如,這個窗體可能是向導類型eb在一個窗體中,可以包括多個SUBMIT按鈕。在這種情況下,應該給每一個按鈕唯一的VALUERequest.Form集合的值,將產生一個值,這個值依賴于按下哪個按鈕用于提交這個窗體。假如用戶按下的“Previous”按鈕,將得到:因此,可查詢Request.Form集合來決定下一個顯示的頁面,例如:NAME屬性。且選擇其值包含在Form集合中的控件名稱。在控件沒有一個完整的標記而是隨后跟著較長的文本的情況下,極為有用,如圖2-3圖2-3提交按鈕屏在ASP頁面中,接收到該數據后,可以檢查按鈕名稱提供的值來判斷按下的是哪個按鈕。這個工作是查詢一個鍵上的ASP集合,如果不存在則返回一個空的字符串。換句話說,如果第二個按鈕(previous頁)按下,則Request.Form(“btnNext”)的值是一個空字符串,則其長度為零而不至于產生一個錯誤。當第二個按鈕按下時,則在 Form集合中這個條目的值Request.Form(“btnPrevious”,將“&;&;&;”其長度大于零。提高使用Request一個ASP集合來一個值是費時的需計算資源的過程,因為這個操作包含了一系列對相關集合的搜索,這比一個局部變量要慢得多。因此,如果打算在頁面中多次使用集合中的一個值,應該考慮將其存貯成為一個局部變量,例如:搜索所有的Request在某些情況下,可能知道一個值的鍵名將出現在Request集合中,但不能準確地知道是哪一個集合。例如,假幾個頁面(或一頁面的不同段)發送一個值給同一個ASP,它可能本章后面部分將研究Form和QueryString集合的要看一下一個值為什么可能出現在不同的集合中,考慮一下這種情況:使用了<A>超級元素請求一個頁面。在這種情況下,增加一個值到請求的唯一方法是把它加到URL在這種情況下,按下窗體上的Help按鈕,將發送RequestForm集合中一對名稱/值“page=Help”。然而,按下<A>超級也可能發送名稱/值“page=Help”,但是這次卻是在Quergstring集合里。為這個值,可使用ASPRequest對象的一個特殊功能:這將按序搜索全部的集合—QueryString、Form、Cookies、ClientCertificate、Serverariables,直到發現第一個匹配值的名稱。這樣做比直接適當的集合效率低,并且是不安全的,除非能絕對保證這個值不會出現在另外一個集合中。例如,可能希望搜集滿足客戶請求的Web服務器的名稱,這通過出現在每個查詢中的總而言之,使用“搜索全部集合”技術要格外,且只在沒有其他技術能夠提供你需要的結果時使用。本章的這一節里,已經集中討論了Form集合,這可能是使用得最多的一個。然而,所有這些技術同樣適用于其他的對象。包括那些由Request對象提供的(即Form、QueryString、 兩章遇到的其他對象提供的集合)。簡短了解一個值如何進入一個QueryString集合,及其優點和不足。然而,同時這兩個 s集合有額外的功能,可以使使用 更加方便,下面討論這個內容。和更 s集s的值比ASP其他集合(例如Form和ServerVariables)的值要復雜得多 是一ASP使得應用 包含可用兩種方式構造的信息,單值提供其值給代碼是通過一個一般的類 通常,客戶只在對創建的中的頁面提出請求時,才將隨發往服務器。 如果隨對整個站點的頁面請求發送,設置path為“/”。假如Expires屬性沒有設置,關閉當前的瀏覽器實例時 注意,我們在向瀏覽器發送任何輸出時,已經創建了,因為,這些是頁面HTTP報頭的一部分。在ASP3.0中,緩沖的缺省狀態是打開的,且沒有輸出被發送,除非使用 在頁面上的任何位置,直到任何輸出“刷新”(flush)到客戶端前,它都可以被執行。 s集合。可以單獨其中項目,方法類似于創建 是只寫的,事實上可以這個集合中一系列的名稱,而不是它們的值。遍 s集合更加方便,可使用名稱為Haskeys的附加屬性。假如的 ,這將返回True。使用Haskeys屬性,可以遍歷完整 這非常類似于前面的從Request.Form集合中提取多個值的復雜代碼。但是這里可以使用Haskeys屬性來判別每個條目是否為一個集合。而在Form例子里,必須查詢Request.Form(item_name).Count屬性,這是因為Form集合(和所有的除 外的他集合)成員不可能是真正的集合。ASP只是做了“幕后”的工作,得到了每個多條目集合的值。了解了各種ASP集合的技術以后,需要解決另一個問題是:Form和QueryString集合之間的差異是什么?假如準備使用ASP,應該清楚這種差異,但需要參考HTTP工作方通過HTTP從Web服務器請求頁面或其他資源,有兩個通用的方法。可使用GET方法直接獲得資源,也可使用POST把值傳給相應資源。GET方法是缺省的,可以看一下本章前面的一假如把一個或多個成對的名稱/值附在請求頁面的URL后,就變成請求的查詢字符串,且在QueryString集合中提供給ASP頁面。單擊eb頁面、 消息或其它文檔超,或在瀏覽的地欄中入地并按車,單擊覽中的Links或Favorites按鈕,所有這些都要使用GET方法。因此,從這些動作中傳遞值給ASP的唯一方法是通過QueryString集合,把值附出現在Request.QueryString合中被的,與面看到的Form集合實例中的工作方式相同。URL和查詢字符串的結合:可以采用如下方式在QueryString集合中提供的值窗體的GET和POST在一個頁面內使用<FORM>段時,可以設置打開的FORM標記的METHOD屬性值為“GETPOSTGETGET”或省略其屬性,瀏覽器將該值綁定在頁面所有控件上,成為一個查詢字符串,且附在被請求頁面的URL上。當這個請求到達eb服務器時,其值由ASP的Request.QueryString集合提供。然而,假如設置METHOD屬性為“POSTHTTP報頭中,通過Request.Form集合提供給ASP。通常來說,可以在所有的HTML窗體中使用POST方法。然而,瀏覽器或服務器的URL字符串長度存在一定的限制。因此,附有長的字符串可能會引起溢出和某些字符串的字符被截掉。同時,查詢字符串出現在瀏覽器的地址欄和所有的保存的鏈連和收藏夾中。不僅如此,還顯露了通過eb服務器時在HTTP請求中不想顯示的值,它也可能出現你的服務器和其他路由服務器的日志文件中。在HTTP請求報頭中的值很少是可見的,并且不出現在日志文件中。使用POST方法需要注意的小問題是,當用戶重新<FORM>時,窗體的值將不再保留,其值為空且必須重新輸。然而,當附在URL上時,其值被為一個,將被保留,因此將出現在所有的URL與字符串結合的請求中,這或許是個優點也可能是個缺點,這根據應用而定()。另一點是URL與查詢字符串的結合體不能包含任何空格或其他字符,否則,avigtor一些他的覽將出問題字符是些用分隔L和確的格式—加號“+”但其的字符能理)。ASP服務器對象提供RLEcoe查看Request和Response到目前,主要討論了一些理論問題,沒有列舉特別的實例。因為已經討論過的內容多數Request和Response對象的大多數屬性。應用所講過的實例,能夠理解這些頁面,并可進行相應的修改,用它們作為試驗實例。本章及其他所有章節的代碼樣例均提供給用戶,可以從Wrox站點必須首先在Web服務器的WWWRoot內的 這里your_server_name_or_IP/subdirectory_name是安裝文件的本地路徑這提供一個包含選項的菜單用來試驗Request和Response對象,首先選擇UsingtheRequest圖2-4實例屏幕圖2-5顯示一個HTML窗體的實例,包含一些預先設置好的值,可以按自己的想法編輯這Submit”按鈕。這將打開一個頁面,如圖2-6所示,顯示集合和otalBytes屬性的全部內容。第一屏顯示的是Form、QueryString和 s集合。圖2-5實例屏幕圖2-6實例屏幕注意,假如在窗體頁中編輯了HTML控件的值,對于 FormCollection”段中看到窗體上的HTML控件的值如何在ASP的Request.Form集合中表示。也可以用原始的<FORM>頁(名稱為request_form.asp)來試驗和檢測,以了解創建窗體的HTML和如何與相應值相聯系。 集合。這里是空的,因為服務器不要求客戶端提供。在本書的后面附錄中可以找到所有ServerVariables集合成員的一個列表,及其值的說明。然而,可從前面討論的在請求頁面時從客戶端發出的HTTP報頭中見到這些成員。當請求收到后,Web服務器也增加它本身的一些值到集合中,正如下面可以看到的由運行在名為wroxbox服務器上的IIS5.0

圖2-7實例屏幕為創建這個頁面,使用了本章前面在對Form集合和如何其值的討論中所看到的完全 遍 圖2-8實例圖2-8實例的集合內讀者應該注意到,在兩個集合中出現的某些值不是從窗體的HTML控件中直接得到的。eryting集chate和mpe的值,如圖2-8。。體的ACTION屬性的URL上,這是可以接受的。工作方式與附在一個<A>元素的HREF屬性上相類似。查詢字符的值出現在QueryString集合中,且被POST的窗體控件值出現在Form集合替,讀者將在第4章的Server對象的URLEncode方法中看到這種情況。為了確保至少有些值出現在 <FORM>頁面request_form.asp。將創建名稱為VisitCount的多值 個頁面創建的,且已經存在于瀏覽器中。如圖2-9所示,讀者可以看到另外的。 圖2-9實例 另外,必須將內容進行編碼,以便它能被正確地傳送到服務器(同樣的規則也適用于將查詢字符串附到URL上)。在第4章中,討論Server對象的URLEncode方法時,讀回到Chapter02實例的最初的Default.asp頁面,這次選擇“UsingtheResponseObject”鏈接,這個頁面顯示的是Response對象的集合和屬性的內容,且提供到所有Response對象方法圖2-10是使用瀏覽器NetscapeCommunicator4.61的屏幕,用來證明使用的是純服務器端和跨平臺兼容技術。需要注意的是 s集合是為Response對象而建立的,僅顯示 名稱而不顯示其值。瀏該頁時,可能得到或得到與這個頁面不同的。各種Response屬性說明了將要用來創建HTTP報頭的一些信息。HTTP報頭與頁面的其他部分(HTML和文本內容)被發往到客戶端。這些屬性中的一些以及所有的Response對象的方法頁面中的屬性是通過相應的屬性并插入到頁面中而創建的。由于這些是動態,通過<> 到每個方法僅是通過<A>元素,頁面中唯一復雜的部分是Response. s集通常只能 ,Request. s集合中的值。當Response. s集合時,必須在發送任何輸出到客戶端之前結束對它的所有。因此在頁面的上部,通過遍歷集合創建頁面的HTML放在一個局部字符串變量中。ASP 的使面看到面中一些合、性和法已到其他頁面用來示Reques和Response對象的各個特性細節,在本章的其余的部分研究這些內容,學習那些提供給ASP代碼使用的集合、方法和屬性的各種技術。在本章前面已經看到了如何使用 s和 s集合來創建和閱,點擊上面兩個頁面中任一個的“ s”時,這個頁面包含一些設置了三個的值的ASP代碼,且在頁面上顯示被執行的代碼,如圖2-11所示。 實例的 s的內容屏幕點擊“ s”的時,cookie的內容就顯示出來了。這是通過遍 s集合而得到的,這與在上一頁所用到的方式完全相同,如圖2-12 實例的 s的內容屏幕這個屏幕圖顯示的是運行前面看到的設置值的代碼的結果。可能會看到其他已經存貯在計算機系統里的。然而,假如現在關閉瀏覽器然后重新打開瀏覽器,然后運行顯示 具有有效期的設置,其他的在瀏覽器關閉時,自動了。 來這兩類值:當瀏覽器關閉時我們不想保存的值(例如用戶的信息)以及在用戶站點時要保留的值。在每種情況下 頁面請求的ASP都是可用的。然而,需要記住的是, 只有在對 中的虛擬路徑(path)內的頁面發出請求時,才會發往服務器。缺省時,假如path的值在 中沒有設置,則其值為創建 的頁的虛擬路徑。為使一個 發往一個站點的所有頁面,需要使用Path="/"。這里是個實例,從自定義的Login頁面中,將用戶的信息存貯在一個 沒有應用有效期,值僅在關閉這個瀏覽器之前保留: 由于把 中的用戶名放在Response.Redirect的URL查詢字符串中,假如在口令輸入時出現錯誤且希望用戶不重新鍵入用戶名可以在login.asp頁面中使用它:可以使用ASP修改現有的cookie,但不能只多值cookie中的一個值。當更新一個在 假如想要更新Visits和LastDate的值,必須先找到不需改變的所有值,然后重寫整個 且對于幾乎所有的其他Response方法和屬性,應該在寫入任何內容(即打開<HYML>標記使用ServerVariables當討論Request對象的內容時,要研究的集合之一就是ServerVariables,,圖2-13實例的ResponseCollections的內容屏幕含了兩種值的結合體,一種是隨同頁面請求從客戶端發送到服務器的HTTP報頭中的值,另外一種是由服務器在接收到請求時本身所提供的值。為顯示ServerVariables集合中值的使用方式,在RequestObject頁面(Show_request.asp)中ServerariablesEx,,圖2-13實例的ResponseCollections的內容屏幕圖214所示窗口顯示的是ServerVariables集合中一些非常有用的值的一個 實例的ResponseCollections的內容屏幕“自”頁在ServerVariables集合中返回的值包含eb服務器的詳細信息和當前頁面的路徑信息。在任何地方創建一個頁面都可使用這些信息。例如創建一個“自”頁面,此頁面能夠再次調用自身完成另一項任務,我們可以用以下代碼:同樣的效果可以用HP的“SP_E”值獲得:使用<>元素打開一個不同頁,可以使用:即使原始頁面的名稱或位置發生變化,這些實例都能正常工作,因為使用了當前頁面的路徑信息()。換句話說,如要為搜索引擎的子會話自動建立這將創建一個完整的URL包括端(這種情況下,不是標準值80)。例如,結果可能是Serverariables集合中,另外一個有用的值是用戶瀏覽器的用戶字符串。在“DetectingtheBrowserType”頁面(browsertype.asp),使用Serverariables集合中的“HTTP_USER_AGENT”值來獲得用戶字符串,一些用來解析該信息并尋找生產廠家名稱和瀏覽器版本。對IE5.0和Navigator4.61的搜索結果分別如圖2-15和圖2-16所示。對于其他廠家的瀏覽器,可以得到一個在AltaVistaWeb站點自動開始搜索廠家的名稱。圖2-15IE5.0中顯示的結 Navigator4.61中顯示的結注意,Netscape在用戶字符串中不提供廠家的名稱,因而無法絕對保證一個ServerVariables集合中另外一個有用的值是“HTTP_ACCEPT_LANGUAGE”,它包含了一個當瀏覽器安裝時指定的,或硬編碼進用戶的地區版本的語言代碼。語言代碼的例子有en-us(英國、)、de-at(德國、澳大利亞)和es-pe(西班牙、秘魯)。語言代碼可以是一般的且省略方言標識:例如,在我們的站點Wrox者,大批瀏覽者都是其他有用的ServerVariables集合的可以和使用Serverariables集合中的任何一成員,控制ASP頁面響應一個請求的方式。可以檢查一個瀏覽者 站點時使用的是否是缺省端口80或還是另一個。在這個例子里,尋找通過端口443的 —這端口供的字層(SecureSocketLayer,SSI)(和其他的協議),且將它們重定向到一個相應的頁面。假如要求瀏覽者且由服務器驗證(而不是允許他們在Web服務器的IUSR帳號下訪問,這個問題將在后面章節中詳細討論),可以查詢用戶名稱,來判定正在與我們打交道的用戶是誰,是否裝載頁面給該用戶。例如,下面的這個代碼將只向名為Administrator的用戶顯示注意ASP不填寫ServerVariables集合直到你其中的一個成員。首次該集合的一個成員將使IIS得到它的全部,應只在需要時才使用Serverariable集合。其他Request和Response現在,來看一下幾個使用Request和Response連接、緩沖和頁面重定向的管理ASP的一個很有用的特點就是使用戶能夠從一個ASP網頁轉向到另一個網頁(ASP或HTML),或另一個源文件(例如一個ZIP文件或文本文件)。這對用戶來說是透明的,實際上是瀏覽器做這個工作。當使用Response.Redirect方法來載入一個新的網頁時,實際上是發送回一個特殊的TTP報頭到客戶。此報頭為:瀏覽器讀到此報頭信息,并按Location值的指示載入頁面。這在功能上與在Web頁中使用這帶來的一個問題是,服務器與用戶之間的服務器可能會提供它自己的包含與新頁面的的消息,而不是直接載入新頁面。而且瀏覽器根據廠商和版本可能做同樣的工作。這就去除了假定的透明,而且對用戶來說一直收到的是錯誤信息,則對你的站點的變得在發送諸如文本或HTML等任何頁面內容后,我們就不能再使用Redirect方法。然而,一個看起來能夠限制“服務器影響”的方法就是,先確定沒有輸出(包括HTTP報頭)被發送到客戶。在ASP2.0中,必須打開緩沖,然后使用Clear方法來清空緩沖區:在ASP3.0中,緩沖缺省為打開,所以第一行可被忽略,但它是無害的,而且能確保我們與其使用這種類型的HTTP報頭重定向,不如使用ASP3.0的一個新特性,它允許我們通過Server對象的Transfer方法轉換為執行另一個網頁,在第4章進一步研ASPIIS5.0中ASP3.0頁面緩沖是缺省打開的,在早期的版本中是缺省關閉的。微軟告訴我們緩沖在IIS5.0中提供了更有效的網頁傳送,這就是緩沖缺省狀態被改變的原因。在大部分情況下,這對我們沒有影響。但是,假一個非常大的網頁,或一個用ASP或別的服務器端代碼和組件花費一定時間創建的網頁,當其各部分完成時,我們能夠分批刷新它們到客戶:有時可能希望在頁面結束之前的某些點上停止代碼的執行,可以通過調用End方法去刷新假如正在創建被緩沖的輸出,且沒有發往客戶,則我們可以改變主意,可以使用Clear方這里有兩個演示緩沖和重定向的實例網頁,可以從“ ResponseObject”主頁面(show_response.asp)它們。第一個Response.Redirect例子網頁命名為redirect.asp,它在緩沖的頁面中寫入一些內容,清除緩沖區,并重定向到另一個網頁:目標頁show_response.aspResponseObject因為這些網頁都在緩沖區內,而且所有的輸出在重定向之前必須被清除,故在瀏覽器中沒有2-17圖2-17瀏覽器的狀態“RequestObject”主頁中,點擊“Response.Flush”將打開第二個示例網頁usebuffer.asp,它簡單地遍歷一個字符串的每一字符,以一定的延遲將它們刷新到客戶,這雖是eb服務器和ASP極低效率的使用方式,但它演示了緩沖的工作方式。 下面是所要求的最小化的ASP代碼,注意我們分別把每個字符刷新到瀏覽器,因為不這IsClientConnected屬性在ASP2.0中已經存在了,但卻有些不可靠。在其返回一個準確的結果之前必須發送一些輸出到客戶。這一問題在ASP3.0中已被解決。現在這一屬性可被自由IsClientConnected是觀察用戶是否仍連到服務器和正在載入ASP創建的網頁的有用方式。如果用戶斷開連接或停止,我們就不用再浪費服務器的資源創建網頁,因為緩沖區內容將被IIS丟棄。所以,對那些需要大量時間計算或資源使用較多的網頁來說,值得在每一階段都檢查瀏覽者是否已離線:操作HTTP我們已經在幾處見到ASP如何創建或修改在響應頁面請求時被發送到客戶的HTTP報頭。圖2-19圖2-19檢查屬性和方創建狀態和定制的HTTP報頭。指定MIME添加PICS接下來將簡要地研究每一個方面。可在“ResponseObject”主頁(show_response.asp)上,單擊相關屬性名或方法2-19緩存和“到期”ASP,用戶的瀏覽器以及他們和服務器之的任一服器都可以緩存HTML和用ASP創建的網頁。當用戶隨后請求頁面時,覽器發送個“修”的求到務器(使用一個包含緩存版本的日期的HTTP_IF_MODIFIED_SINCE報,若沒有被修改,服務器應用狀態碼和消息“304NotModified”來響應,瀏覽器將使用緩存的內容而不會通過網絡一個副本。若已經存在已修改的版本,它就會與“200OK”狀Response.CacheControl其他的一些因素也會影響這一處理過程。然而,任一被網頁使用的網絡路由內的服務器(一般位于客戶機端)Response.CacheControl屬性為Private來放棄緩存網頁。在ASP3.0中對ASP網頁這是缺省的,不用設置。但在網頁為個別者特別定制時尤其有用。這可以別在同網絡的用進入一網。當CacheControl的屬性值被設為Public時,允許服務器緩存網頁。注意,一些服務器可能表現得不盡相同,或忽視或越過這個報頭。在IE4中,在服務器緩存可時,有可能得到虛“Thispagehasexpired”消息。我們已提供了一個網頁(expiretest_form.asp),可以通過自己的服務器在網絡上做試驗,來檢查這一屬性的影響。可以通過在“ResponseObject”主頁中單擊“Response.CacheControl”來顯示這個網頁,如圖2-20所示圖2-20顯示檢查結果這一頁面提交到expiretest_result.asp網頁時,能夠設置Response.CacheControl屬性,然后在網頁中插入值和被執行的時間:通過單擊瀏覽器上的“BackForward圖2-21顯示檢查結果Response.Expires和Response.ExpiresA圖2-21顯示檢查結果。Response對象的Expires和ExpiresAbsolute屬性Response.Expires定義了網頁在從緩存區被丟棄前應保持有效的時間長度,以創建以來的分鐘數形式表示。ExpiresAbsolute屬性為到期時間設置了一個日期和時間。。我們提供一個命名為addheaders_form.asp的例子網頁,用于演示如何使用這些屬性。在“ResponseObject”主頁中單擊對這兩種屬性的,如圖2-22所示 在這一頁面中,可加入自己定制的HTTP報頭,并可設置一些影響響應的HTTP報頭的多Submit”按鈕上單擊時,頁面show_headers.asp在返回的數據流中添加所選的報頭,然后顯示用來完成此操作的代碼,顯示相應的執行時間,可用來檢查頁面是被緩存還是被再次執行,如圖2-23 show_headers.asp網頁中的代碼創建和添加HTTP的報頭“PRAGMA”(至今我們還沒討論過)。一些(先前的)的服務器使用它作為網頁是否應被緩存的指示。缺省是網頁被緩沖,除非接受到HTTP報頭“PRAGMA=NO-CACHE”。創建狀態碼和定制的HTTP可使用先前在實例網頁中所看到的Response對象的AddHeader方法來創建自己的狀態碼或自己喜歡的定制的報頭。這一方法需要兩個參數:HTTP報頭名稱或一個包含其值或分配給它REFRESH報頭:這等同于客戶機端<META>換句話說,也可配合Status屬性使用AddHeader方法Response.Status屬性可被用來發送一些所需要的狀態消息,例如添加如下幾行:強制瀏覽器顯示一個用戶名/口令框,然后使用BASIC驗證把它們發送回服務器(將在本書后續部分看到驗證方法)。當我們想向瀏覽器發送一個動態創建的字符串,而且它們自己提供給瀏覽器時沒有直接Response.ContentType的。除非特別指定,所有ASPtext/typeMIME類型(MIME代表Multi-purposeInternetMultimediaExtension或Multi-purposeInternetMail例如,若發送到客戶的數據流是通過從數據庫讀二進制值創建的,就需要在發送任何內容之前添加合適的CONTENT-TYPE報頭:添加PICSResponse.Pics屬性僅僅是添加一個PICS(PlatformforInternetContentsystem卷標到頁面這段代碼添加了如下的PICS卷標:要得到關于PICS的的信息,或了解的定義頁面內容的方式,請檢索在InternetServiceManager在第1章,已經說明了如何在InternetServiceManager(MMC插件)圖2-24HTTPHeaders選項卡屏 CustomHTTPHeaders欄的 Web和IIS5.0中 CustomHTTPHeaders欄的 ASP代碼設置這些屬性的替代方法”在Web站點或 上右擊鼠標并選“Propertie“HTTPHeaders選項卡中,可設置頁面內容有效期的相對時間或絕對日期,定義定制報頭,創建PICS內容等級,也可以通過MIME類型映射來定義內容類型,如圖2-24示。”,,在圖2-24中,可以看到已創建了自定義的REFRESHTT報頭,應用于從此 載入所有網頁。即每一分鐘自動地重載(刷新)(對于顯示棒球比賽的比分是非常理想的但對服務器而言負擔太了)。CustomHTTPHeaders欄的Edit框如圖2-25所。,,要在“MIMEMap”框中添加自定義的內容類型映射,只需在“Properties”主框中單擊“FileTypes”按鈕把它們添加到中當使用HTTP報頭開始試驗時,你很快會發現不是所有的瀏覽器表現都相同許多瀏覽器以不同的方式響應不同的HTTP報頭,使得可靠地建立一個普遍適的時。使用客戶假如設立了一個安全的eb或部分內

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論