張智星 jang@mirlab.org http://mirlab.org/jang 台大資工系 MIR實驗室 第十四章 Request 物件 張智星 jang@mirlab.org http://mirlab.org/jang 台大資工系 MIR實驗室
本章大綱 大綱 主題 本章介紹 ASP 的內建物件 Request,可以用來取得用戶對伺服器進行要求(Request)時,所傳送的各種資料。 14-2:讀取伺服器環境變數 14-3:傳送表單資料 14-4:傳送小餅乾
14-1:Request 物件簡介 本小節介紹Request的物件及其基本功用。
Request 物件的基本介紹 ASP 的內建物件之一。 取得用戶對伺服器進行要求(Request)時,對伺服器所送出的資訊。 例如:用戶端的表單資訊、小餅乾資訊、認證資訊及伺服器的環境變數等。 經由 HTTP 的表頭(Headers)傳到伺服器端,經由伺服器解析後,存放於 Request 物件。
Request 物件的集合 下列為五個集合(Collections): Request.ClientCertificate:用戶端的認證資訊 Request.Cookies:用戶端硬碟儲存的Cookie資訊 Request.Form:以 post 為傳送方法的表單資訊 Request.QueryString:以 get 為傳送方法的表單資訊 Request.ServerVariables:伺服器環境變數的值
14-2:讀取伺服器環境變數 本小節介紹如何取得環境變數以得知伺服器和用戶端的各種資訊。
得知用戶端及伺服器端的 IP 方法: HTTP request 來源 IP: Request.ServerVariables("REMOTE_ADDR") HTTP request 伺服器 IP: Request.ServerVariables("LOCAL_ADDR") HTTP request 代理伺服器 IP: Request.ServerVariables("HTTP_VIA") HTTP request 原始來源 IP: Request.ServerVariables("HTTP_X_FORWARDED_FOR")
範例14-1 主題:使用 Request.ServerVariables 來抓取 IP Webpage: remote host, local host 程式碼重點 說明 若經由代理伺服器(Proxy Server)取得網頁, Request.ServerVariables("REMOTE_ADDR") 就變成代理伺服器的 IP 。 Request.ServerVariables(“HTTP_VIA”) :顯示所用的代理伺服器。 Request.ServerVariables(“HTTP_X_FORWARDED_FOR”):取得真正客戶端的 IP。 若沒設定代理伺服器,以上兩個皆為空字串。 用戶端IP 伺服器IP <%=Request.ServerVariables("REMOTE_ADDR")%> <%=Request.ServerVariables("LOCAL_ADDR")%> <%=Request.ServerVariables("HTTP_VIA")%> <%=Request.ServerVariables("HTTP_X_FORWARDED_FOR")%>
範例14-2 主題:限制能夠瀏覽此網頁的 IP Webpage: remote host, local host 程式碼重點 說明 使用ASP時,某字串存入另一個字串中,通常會加入一個空字串,以免因某字串非字串而產生錯誤。(ip=Request.ServerVariables("REMOTE_ADDR")+"") domain="140.112."; ip=Request.ServerVariables("REMOTE_ADDR")+""; if (ip.indexOf(domain)!=0){ Response.write("This page is not allowed!"); Response.end; // 停止網頁傳送! }
與伺服器相關的資訊 列出如下: 伺服器網域名稱:Request.ServerVariables("SERVER_NAME") 伺服器埠號: Request.ServerVariables("SERVER_PORT") 伺服器協定:Request.ServerVariables("SERVER_PROTOCOL") 網頁伺服器軟體名稱:Request.ServerVariables("SERVER_SOFTWARE") 伺服器加密:Request.ServerVariables("SERVER_PORT_SECURE")
範例14-3 主題:列出與伺服器相關的資訊 Webpage: remote host, local host 程式碼重點 說明 使用ASP的Request.ServerVariables得知伺服器相關資訊。 <%=Request.ServerVariables("SERVER_NAME")%> <%=Request.ServerVariables("SERVER_PORT")%> <%=Request.ServerVariables("SERVER_PROTOCOL")%> <%=Request.ServerVariables("SERVER_SOFTWARE")%> <%=Request.ServerVariables("SERVER_PORT_SECURE")%>
與網頁路徑相關的資訊 列出如下: 伺服器根目錄的實體硬碟路徑:Request.ServerVariables("APPL_PHYSICAL_PATH") 網頁在實體硬碟的路徑:Request.ServerVariables("PATH_TRANSLATED") 網頁相對應於伺服器根目錄的路徑:Request.ServerVariables("PATH_INFO") 網頁相對應於伺服器根目錄的路徑:Request.ServerVariables("SCRIPT_NAME") 網頁相對應於伺服器根目錄的路徑:Request.ServerVariables("URL")
範例14-4 主題:列出與網頁路徑相關的資訊 Webpage: remote host, local host 程式碼重點 說明 使用ASP的Request.ServerVariables得知網頁路徑的相關資訊。 Request.ServerVariables("PATH_INFO")、Request.ServerVariables("SCRIPT_NAME") 和 Request.ServerVariables("URL") 都會回傳一樣的結果。 <%=Request.ServerVariables("APPL_PHYSICAL_PATH")%> <%=Request.ServerVariables("PATH_TRANSLATED")%> <%=Request.ServerVariables("PATH_INFO")%> <%=Request.ServerVariables("SCRIPT_NAME")%> <%=Request.ServerVariables("URL")%></font>
得知其他相關資訊 列出如下: 連結至目前網頁的前一個網頁:Request.ServerVariables("HTTP_REFERER") 用戶端登錄至網頁的帳號:Request.ServerVariables("LOGON_USER")
範例14-5 主題:抓取「連結至目前網頁的前一個網頁」 Webpage: remote host, local host 程式碼重點 說明 用 Request.ServerVariables("HTTP_REFERER")可得知: 使用者是從哪個友情贊助或廣告網頁連結而來。 知道哪個網頁偷連結到你的網頁。 <%=Request.ServerVariables("HTTP_REFERER")%>
範例14-6 (1/2) 主題:列出 Request.ServerVariables所有相關變數(JScript) Webpage: remote host, local host 程式碼重點 說明 利用引入的listdict.inc檔,將所有Request.ServerVariables都列出。 可以使用 VBScript 來達到相同功能,請見範例程式碼「example/request/serverVariables_vbs.asp」。 <!--#include file="../listdict.inc"--> <% listdict(Request.ServerVariables, "Request.ServerVariables");%>
範例14-6 (2/2) listdict.inc(印出任何Dictionary變數) listdict.inc 包含兩個函數,分別用於對付 JScript 和 VBScript,可列印出任何 Dictionary 變數。 JScript 的 listdict() 函數中,用到 Enumerator 的物件,此物件是類似於 VBScript 的 Dictionary 變數,可用字串來索引另一個字串。
Request.ServerVariables變數的意義 可以直接查看下列網頁: http://www.w3schools.com/asp/coll_servervariables.asp
14-3:傳送表單資料 本小節介紹Request.Form 、 Request.QueryString以及表單資料的傳送。
Request.Form & Request.QueryString 用途 存放用戶端在表單填入的資訊。 讀出輸入值的作法 表單的傳輸方式是 post: 表單的傳輸方式是 get: 無論是 post 或 get,只要欄位名稱不重複: 輸入資料 = Request.Form("欄位名稱") 輸入資料 = Request.QueryString("欄位名稱") 輸入資料 = Request("欄位名稱")
無論post或get都可用Request 說明: 未給定 Collection 時,會嘗試先讀取 Request.QueryString("欄位名稱"),若成功,則停止;若失敗,則會再嘗試讀取 Request.Form("欄位名稱")。
範例14-7 主題:傳送表單資料的範例 Webpage: remote host, local host 說明 如果經由 get 送出: 網址列會列出表單相關的選項 。 原先網址附加的選項(xxx=yyy&aaa=bbb)會消失。 如果經由 post 送出: 網址列不會列出表單相關的選項 。 原先網址附加選項(xxx=yyy&aaa=bbb)不會消失 。 可知post 和 get 可用此方式來並行。 同時用get和post ,最好不要用Request的簡寫方式。
欄位名稱重複時的索引 方法一: 方法二: 說明 name:欄位名稱 index:欄位索引值,從 1 至 Request.Form(name).Count 這裡的索引值是從 1 開始,而不是 0。 Request.QueryString(name)(index) Request.Form(name)(index)
範例14-8 主題:解析表單資料的重複欄位 Webpage: remote host, local host 說明 有重複欄位,但未用 index 指定所要讀取的值時,則 ASP 會讀到多個值所形成的字串,其中每個值都以逗點分開。
14-4:傳送小餅乾 本節主要討論如何以 ASP對小餅乾進行各種處理。
Cookies基本概念的複習 Netscape 公司所發展出來的概念。 目的是要克服 Http Protocals 的 Stateless 的特性。 在客戶端存取一些資訊,使得在 Http Requests 間,能保留一些共通的資訊。 可使用客戶端的 JavaScript 來讀寫小餅乾。
ASP中的Cookies 分兩部分: Request.Cookies:讀取小餅乾的內容。 負責讀取User Agent傳送到伺服器之小餅乾內容。 我們只能只能讀取此變數,而不應該修改其內容。 Response.Cookies:設定小餅乾的內容。 可從伺服器設定小餅乾。
如何讀取小餅乾的內容? 使用 Request.Cookies(Name) 讀取當用戶對伺服器進行要求時,所傳送的相關小餅乾資訊。 Request.Cookies是一個 Dictionary 變數,可以對其內容進行列表。
範例14-9 主題:以 JScript 印出 Request.Cookies 的內容 Webpage: remote host, local host 程式碼重點 說明 使用 Response.Cookies(“111”) = “aaa” 及 Response.Cookies(“222”) = “bbb” 設定兩個小餅乾。 用 listdict() 函數印出存放於 Request.Cookies 的所有小餅乾的值。 Response.Cookies("111") = today.toLocaleString(); Response.Cookies("222") = "bbb"; listdict(Request.Cookies, "Request.Cookies");
範例14-10 (1/2) 主題:小餅乾設定和列表的順序(伺服與客戶端的執行順序) Webpage: remote host, local host 程式碼重點 說明 驗證順序: 先:使用Request.Cookies列出與本頁相關的小餅乾。 後:使用用戶端的JavaScript設定小餅乾,名稱是 lastLoadTime,記錄網頁載入時間。 <!--先在伺服器做的事:列出本頁的小餅乾--> <% listdict(Request.Cookies, "Request.Cookies"); %> // 後在用戶端做的事:設定小餅乾 <script> setCookie("lastLoadTime", todayString);</script>
範例14-10 (2/2) 觀察事項: 用戶第一次要求此網頁時,Request.Cookies 並沒有 lastLoadTime,此小餅乾在網頁被載入後才存在。 第二次再要求此網頁時,lastLoadTime 已經存在於 Request.Cookies,但都是儲存上一次網頁載入的時間,因 Request.Cookies 只傳目前網頁相關的小餅乾。 結論: ASP的網頁,都是先在伺服器端執行 server-side scripts,才到用戶端執行 client-side scripts。 順序不因 server-side scripts 和 client-side scripts在網頁中的位置而有改變。
Cookie 設定流程說明 伺服器 用戶端 Request: 經由表頭資訊 傳送相關的Cookie 到伺服器 JavaScript: 使用戶端的程式碼 來處理Cookie 伺服器 用戶端 Response: 經由表頭資訊 讓瀏覽器設定 相關的Cookie
Cookie 對網頁的作用 無論是 Request 或是 Response,Cookie 都會被帶在表頭資訊中傳送。 在 Request 時,瀏覽器會網頁以前留下來的 Cookie 以表頭資訊一起傳到伺服器。 在 Response 時,伺服器將網頁必須設定的 Cookie 以表頭資訊送到伺服器。我們可以使用 PHP 或 ASP 來控制由伺服器端指定寫入的 Cookie 當網頁送到用戶端時,我們可以使用 JavaScript 來指定 Cookie 的讀寫。