第 6 章 Application、Session 物件與Cookie 製作
Web應用程式的建立 Web應用程式的定義 Web站台上,利用數個網頁共同完成某特定工作的系統,稱之為Web應用程式。 HTML網頁 ASP網頁
Web應用程式的建立 Web應用程式的建構觀念 從第1章的說明,可以瞭解在WWW的運作機制中,客戶端與伺服端間並不是隨時保持連線狀態,而是伺服器被動地等待客戶端提出需求,伺服端才進行回應。 建構Web應用程式的主要問題,在於組成Web應用程式的網頁本質上是否各自獨立,並不像撰寫一般應用程式時,有所謂的主程式負責控制整個程式流程。
Web應用程式的建立 建構Web應用程式時,有以下三個問題必須加以釐清: 一、如何定義Web應用程式 二、如何界定Web應用程式的開始與終止 三、如何建立可供各網頁運用的變數
Web應用程式的建立 Web應用程式的定義 對於Web應用程式的界定方式,ASP環境是以虛擬目錄為單位。在某個虛擬目錄及其子目錄(非虛擬目錄)下的ASP網頁,將視為同一個Web應用程式。
Web應用程式的建立 Web應用程式的開始與終止 由於在某一虛擬目錄下,ASP網頁將被視為一個Web應用程式。因此,在ASP機制中,當某位使用者瀏覽虛擬目錄下任一ASP網頁時,即為Web應用程式執行的開始。當在某段時間內(預設為20分鐘),沒有任何一位使用者執行虛擬目錄下任何ASP網頁時,即視為此終止執行此Web應用程式。
Web應用程式的建立 定義跨ASP網頁的變數 在ASP網頁內使用的變數,其有效範圍僅侷限於宣告該變數的ASP網頁。 為了解決這樣的問題, ASP提供Application物件、Session物件,使用者可以在這兩個物件中宣告變數,以達到跨網頁存取資料的目的。 儲存客戶端的Cookie(一個純文字檔),也是另一個可以儲存跨網頁變數的方法。
Application與Session物件的使用 - Application與Session物件 在ASP中Application物件用於代表一個Web應用程式,且不論連結到同一Web應用程式的使用者有幾個,Application物件都只有一個。
Application與Session物件的使用 - Application與Session物件 Session物件所代表的是每個登入使用者的個別連線。因此,若有10位使用者同時登入某個Web應用程式時,便會有10個分別代表各使用者連線的Session物件。 在ASP中,每個Session物件預設的有效執行時間為20分鐘,因此,若某使用者連線在20分鐘內,不曾再度向Web伺服器要求瀏覽網頁時,此連線將被視為斷線,代表該連線的Session物件也將自動消滅。
Application與Session物件的使用 - Application與Session物件 下圖為連線至Web應用程式的客戶端與Session物件及Application物件的關係。
Application與Session物件的使用 - Application與Session物件 建構Web應用程式時,Application物件與Session物件的用途,主要有兩個: 一是建立跨網頁的變數 二是利用這兩個物件的On_Start與On_End事件
Application與Session物件的使用 - Application與Session物件 一、建立跨網頁的變數 儲存於Application物件的變數,稱之為Application變數,此類變數可供此Web應用程式的所有連線,正在執行之ASP網頁存取。 儲存於Session物件的變數,稱之為Session變數,則僅可供同一連線所執行的ASP網頁存取。
Application與Session物件的使用 - Application與Session物件 二、On_Start與On_End事件的利用 當Web伺服器建立Application物件與Session物件時,將先觸發On_Start事件。物件消滅時,則會觸發On_End事件,回應這些事件的程序都必須撰寫在Global.asa檔中,且該檔必須置於存放該Web應用程式之虛擬目錄的根目錄下
Application與Session物件的使用 - Application變數的使用 Application物件用於代表Web應用程式,而所有執行此Web應用程式的使用者連線,都包含在同一個Application物件中。 儲存於Application物件內的變數不僅跨網頁,更可跨連線地供執行此Web應用程式的所有連線存取。 這裡所謂的可被所有連線存取,更嚴謹的說法應該是『可被所有連線瀏覽之ASP網頁存取』。
Application與Session物件的使用 - Application變數的使用 起始一個Application變數的語法如下:Application(變數名稱) = 值 取得Application變數的語法如下: 變數 = Application(變數名稱)
Application與Session物件的使用 - Application變數的使用 以下敘述將把儲存於Application物件的Num變數,設定為0。 Application("Num") = 0 以下敘述將取得Application物件的Num變數之值,並儲存於LogNum變數內。 LogNum = Application("Num")
Application與Session物件的使用 - Application變數的使用 判斷變數是否已起始化 若從Application物件取得的變數並未經過起始時(也就是尚未被設定值),則『Application(變數名稱)』敘述將傳回Empty值。 可以利用下列判斷敘述,判別該變數是否已起始。 If Application(變數名稱) = Empty Then …… End If
Application與Session物件的使用 - Application變數的使用 或利用IsEmpty函數。 If IsEmpty(Application(變數名稱) ) Then …… End If
Application與Session物件的使用 - Session變數的使用 由於Session物件代表的是某個執行Web應用程式的使用者連線,因此,儲存在Session物件的變數,僅可供該連線所瀏覽的ASP網頁存取。
Application與Session物件的使用 - Session變數的使用
Application與Session物件的使用 - Session變數的使用 以下敘述將把儲存於Session物件的Num變數,設定為0。 Session("Num") = 0 以下敘述將取得Session物件內的Num變數之值,並儲存於LogNum變數。 LogNum = Session("Num")
Application與Session物件的使用 - Session變數的使用 判斷變數是否已起始化 若從Session物件取得的變數並未經過起始時(也就是尚未被設定值),則『Session(變數名稱)』將傳回Empty值。
Application與Session物件的使用 - Session變數的使用 可以利用下列判斷敘述判別該變數是否已起始。 If Session(變數名稱) = Empty Then …… End If 或使用IsEmpty函數。 If IsEmpty(Session(變數名稱)) Then
Application與Session物件的使用 - Session變數的使用 以IE來說,若每個瀏覽器均以執行應用程式之方式啟動的話,那每個瀏覽器都將被視為單獨的連線,在Web伺服器將有一個Session物件代表各個連線。
Application與Session物件的使用 - Session變數的使用 下圖將先在作業系統中,開啟一個IE瀏覽範例6-2的Session1.asp檔。然後,從 開始 功能表啟動另一個IE,並瀏覽相同網頁。
Application與Session物件的使用 - Session變數的使用 若開啟IE的方式,是從正在執行的IE中,執行 [檔案/新增/視窗] 於另一個IE開啟網頁時,這兩個IE將被Web伺服器視為同一個Session。
Application與Session物件的使用 - Session變數的使用 此時間間隔儲存於Session物件的TimeOut屬性,預設值為20。 欲變更此屬性的設定語法如下: Session.TimeOut = 分鐘數
Application與Session物件的使用 - Session變數的使用 Web伺服器怎麼知道… 下圖為跨網頁存取變數的機制運作的示意圖。
Application與Session物件的使用 - 物件變數的可存取範圍 Application物件代表的是一個Web應用程式,其認定方式是以虛擬目錄為單位。 Session物件則是包含在Application物件中,代表某使用者連線的物件。 假若在某虛擬目錄下又有一個虛擬目錄時,這兩個虛擬目錄下的Web應用程式將彼此獨立。
Application與Session物件的使用 - 物件變數的可存取範圍 第一層虛擬目錄內的ASP網頁,若將資料儲存為Application變數或Session變數時,其子虛擬目錄下的ASP網頁並無法存取到前述儲存於Application物件或Session物件的資料。 若虛擬目錄的下一層目錄,並未被指定為虛擬目錄時,該子目錄的ASP網頁與上一層目錄的ASP網頁將被視為同一個Web應用程式。
Application與Session物件的使用 - 物件變數的可存取範圍 ch6\VirTest資料夾內有VirDir與NotVirDir兩個子資料夾,分別將VirTest資料夾與VirDir子資料夾設定為虛擬目錄,IIS完成指定的畫面如下:
Application與Session物件的使用 - 物件變數的可存取範圍 下表將說明這三個ASP檔的功能與位置。
Application與Session物件的使用 - 物件變數的可存取範圍 先開啟VirTest目錄的SeApTest.asp檔,該網頁將把Application("Run")變數設定為10,Session("Run")變數設定為100。 按下
Application與Session物件的使用 - 物件變數的可存取範圍 接著,按下連結到下一層虛擬目錄超連結,開啟Ch6/VirDir目錄(此為虛擬目錄)下的SeApTestV.asp。 按下
Application與Session物件的使用 - 物件變數的可存取範圍 按下回上一層超連結,回到Ch6/VirDir目錄下的SeApTest.asp檔,再按下連結到下一層非虛擬目錄超連結,開啟NotVirDir目錄下的SeApTestNV.asp。
Global .asa檔 - Global.asa檔與事件回應 當Web應用程式執行於IIS上時,這些事件回應程序將撰寫於Global.asa檔中,且必須放置在虛擬目錄對應的磁碟資料夾內,例如:我們指定chatroom虛擬目錄所對應的資料夾為C:\Inetpub\chatroom時,該虛擬目錄下Web應用程式使用的Global.asa檔便必須置於該資料夾內。 一個Web應用程式,只有一個Global.asa檔。
Global .asa檔 - 事件回應程序的建立與執行 語法如下: <%@ Language="vbscript" %> <% 事件程序程式碼 %>
Global .asa檔 - 事件回應程序的建立與執行 還可以利用以下HTML語法指定所使用的語言。 <SCRIPT Language="vbscript" RunAt="server"> 事件程序程式碼 </SCRIPT>
Global .asa檔 - 事件回應程序的建立與執行 Global.asa檔內,建立回應Application物件Start事件之程序的語法如下: Sub Application_OnStart …… End Sub
Global .asa檔 - 事件回應程序的建立與執行 回應Application物件End事件之程序的語法如下: Sub Application_OnEnd …… End Sub
Global .asa檔 - 事件回應程序的建立與執行 回應Session物件Start事件之程序的語法如下: Sub Session_OnStart …… End Sub 回應Session物件End事件之程序的語法如下: Sub Session_OnEnd
Global .asa檔 - 事件回應程序的建立與執行 事件回應程序的執行 當第一位使用者啟動Web應用程式時,事件程序與ASP網頁的執行順序如下: Application_OnStart Session_OnStart ASP網頁 第二位以後的使用者執行Web應用程式時,事件程序與ASP網頁的執行順序如下: Session_OnStart ASP網頁
Global .asa檔 - 事件回應程序的建立與執行 當最後一位Web應用程式的使用者登出時,事件程序與ASP網頁的執行順序如下: Session_OnEnd Application_OnEnd 若登出的不是最後一位Web應用程式的使用者,則只有Session_OnEnd事件程序會被呼叫。
Global .asa檔 - Session物件的強制消滅 當Session物件消滅時,必須利用Session_OnEnd事件程序適當處理資料,例如:將資料回存至資料庫或者檔案。Session物件的消滅,對應到使用者的操作動態時,所代表的就是使用者的斷線。 連線斷線的方式,共有以下兩種方式: 一、等待使用者閒置連線超過有效執行時間 二、使用Abandon方法強制斷線
Global .asa檔 - Session物件的強制消滅 一、等待使用者閒置連線超過有效執行時間 此方式是Web伺服器被動地等待使用者於有效執行時間內,未有再度與伺服器連線之動作時,自動執行斷線動作,並刪除Session物件。 此有效執行時間儲存於Session物件的TimeOut屬性,預設值為20分鐘。
Global .asa檔 - Session物件的強制消滅 二、使用Abandon方法強制斷線 當在ASP網頁呼叫Session物件的Abandon方法後,將可執行強制消滅伺服器上代表該連線的Session物件,並釋放所佔據的電腦資源,並在物件刪除前呼叫Session_OnEnd事件程序。 執行相關的資料處理與儲存動作,語法如下: Session.Abandon
Global .asa檔 - 同時連線人數的計算 下圖將指定Global資料夾為Web伺服器ch6目錄下的虛擬目錄。
Global .asa檔 - 同時連線人數的計算 同時連線人數計算的機制 整個範例有關同時連線人數的計算,將由Global.asa檔負責。當使用者在Login.htm中,輸入姓名並按下 登入 按鈕後,將呼叫Login.asp,此時Web應用程式將正式被執行。
Global .asa檔 - 同時連線人數的計算 假設登入的使用者為此Web應用程式的第一位使用者,則Login.asp檔被執行前,將先啟動Application_OnStart事件程序,並執行起始Application物件LogCount變數為0的動作,此變數的值將代表目前連線的人數。 接著,執行Session_OnStart事件程序,將Application物件的LogCount變數加1。而第二位以後的使用者登入Web應用程式所在的虛擬目錄時,亦將再次呼叫Session_OnStart事件程序,將LogCount變數加1。
Global .asa檔 - 同時連線人數的計算 當有使用者離線時,不論是超過有效執行時間或者是呼叫Session物件的Abandon方法,均會執行Session_OnEnd事件程序,將LogCount變數減1。 使用者登出動作 當使用者按下Login.asp檔的登出連結時,將可重新呼叫Login.asp檔,但由於此連結將傳入Logout參數,其值為true。
Cookie的使用 - 什麼是Cookie Cookie是一個儲存於客戶端,供瀏覽器與Web伺服器互通資料用的純文字檔(.txt)。 以IE來說,當執行IE時,將在電腦內產生一個Cookie,等到關閉IE後,便會刪除這個Cookie,且在同一台電腦上每個單獨執行的IE都有一個專屬的Cookie。
Cookie的使用 - 什麼是Cookie 當Web應用程式被執行時,可以將某些資料儲存於Cookie中,供執行程式時使用,這種變數稱為Cookie變數。 不論使用Cookie或者是Session物件,瀏覽器都必須開啟Cookie功能,否則ASP網頁將無法正常運作。
Cookie的使用 - 什麼是Cookie 查看IE是否開啟Cookie Cookie的使用設定
Cookie的使用 - Cookie資料的存取
Cookie的使用 - Cookie資料的存取 利用Response物件,將資料儲存變數至Cookie的語法如下: Response.Cookies(“變數名稱”) = 變數值 利用Request物件取得Cookie變數的語法如下: 變數 = Request.Cookies("變數名稱")
Cookie的使用 - Cookie資料的存取 客戶端要求瀏覽網頁的過程可以分成兩個階段:
Cookie的使用 - Cookie資料的存取 欲設定ASP網頁不經緩衝區直接將資料輸出至客戶端時,將資料儲存至Cookie的程式碼必須撰寫在<HTML>標籤前。 輸出緩衝區資料的情形有兩種,一是網頁資料已經完全輸出,二是呼叫Response物件的End或者Flush方法強制輸出資料。
Cookie的使用 - Cookie資料的存取 判斷變數是否已起始化 若從Cookie取得的變數並未經過起始時(也就是尚未被設定值),則『Request.Cookies(變數名稱)』將傳回零長度字串(“”)。 可利用下列判斷敘述判別該變數是否已經起始。 If Request.Cookies(變數名稱) = "" Then …… End If
Cookie的使用 - Cookie資料的存取 但由於利用『=』符號執行運算式比較時,Empty將被視為零長度字串,因此,上述判斷敘述亦可以改寫為以下方式。 If Request.Cookies(變數名稱) = Empty Then …… End If
Cookie的使用 - 多值型Cookie變數的使用 多值型Cookie變數的儲存語法如下Response.Cookies(“變數群組名稱”)(“變數名稱”) = 變數值 變數群組名稱:該組變數的名稱 變數名稱:變數群組內個別變數的名稱 取得多值型Cookie變數的語法如下: 變數 = Request.Cookies("變數群組名稱")("變數名稱")
Cookie的使用 - 多值型Cookie變數的使用 以下敘述將把Name變數與E_Mail變數歸類為Personal變數群組,儲存於Cookie中。 Response.Cookies("Personal")("Name") = "郭尚君" Response.Cookies("Personal")("E_Mail") = "sc.kuo@msa.hinet.net"
Cookie的使用 - Cookie變數的可存取範圍 當在Web伺服器某個目錄下的ASP網頁將資料儲存為Cookie變數時,該變數預設的可存取範圍如下: 建立該變數的ASP網頁 與建立該變數之ASP網頁同一目錄的ASP網頁 建立該變數之ASP網頁所在目錄之子目錄下的ASP網頁
Cookie的使用 - Cookie變數的可存取範圍 這三個ASP檔的功能與位置說明如下:
Cookie的使用 - Cookie變數的可存取範圍 先開啟VirTest目錄下的CoTest1.asp檔,該檔將把Cookies("Run1")變數起始為1000。 按下
Cookie的使用 - Cookie變數的可存取範圍 接著,按下連結到下一層虛擬目錄超連結開啟VirDir目錄(此為虛擬目錄)下的CoTest1NV.asp,您將發現該網頁可取得Cookies("Run1")變數的值。 按下
Cookie的使用 - Cookie變數的可存取範圍 按下回上一層超連結,回到Ch6目錄的CoTest1.asp檔,再按下連結到下一層非虛擬目錄超連結,開啟NotVirDir目錄的CoTest1NV.asp,您將發現該網頁亦可取得Cookies("Run1")變數的值。
Cookie的使用 - Cookie變數的可存取範圍 這三個ASP檔的功能與位置說明如下:
Cookie的使用 - Cookie變數的可存取範圍 先開啟Ch6/VirTest/VirDir/目錄下的CoTest2.asp檔,該檔將把Cookies("Run2")變數起始為10000。 按下
Cookie的使用 - Cookie變數的可存取範圍 接著,按下到上一層目錄超連結開啟VirDir目錄的CoTest2UP.asp 。
Cookie的使用 - Cookie變數的可存取範圍 按下回到VirDir/CoTest2.asp超連結回到VirTest/VirDir/CoTest2.asp檔,按下開啟/ch6/NotVirDir/CoTest2AN.asp超連結開啟NotVirDir目錄的CoTest2AN.asp檔。
Cookie的使用 - 設定Cookie變數的有效時間 預設情形下,關閉瀏覽器時,由ASP網頁儲存的Cookie變數會被刪除。 ASP網頁可以在瀏覽過後,利用指定Cookie變數有效時間的方式,將資料留在客戶端的電腦上,且這些資料是專屬於儲存該資料的ASP網頁。
Cookie的使用 - 設定Cookie變數的有效時間 儲存資料的ASP網頁 與儲存資料之ASP網頁在同一個目錄下ASP網頁 位於儲存資料之ASP網頁所在目錄之子目錄下的ASP網頁
Cookie的使用 - 設定Cookie變數的有效時間 設定有效時間的語法 某Cookie變數的有效時間設定於Expires屬性,該屬性為唯寫屬性,您無法讀取僅可設定儲存值,設定語法如下: Response.Cookies("變數名稱").Expires= 時間值
Cookie的使用 - 設定Cookie變數的有效時間 當設定Expires屬性後,Cookie變數的資料便會儲存在『C:\Documents and Settings\登入帳號\Cookies』資料夾,且檔案的命名原則如下: Windows帳號@位址… Windows帳號為進入Windows作業系統所使用的登入帳號。 位址為建立此Cookie資料的網站位址,若瀏覽的網站在Intranet中(企業內部網路),則為虛擬目錄路徑。
Cookie的使用 - 設定Cookie變數的有效時間 以下敘述將設定儲存於Cookie的Personal變數在2004/4/29以前均有效。 Response.Cookies("Personal").Expires = #2004/4/29# 以下敘述將設定Personal資料,在登入後的30天內有效,其中Date函數將傳回使用者瀏覽網頁的日期。 Response.Cookies("Personal").Expires = Date + 30
Cookie的使用 - 設定Cookie變數的有效時間 設定有效時間的副作用 當某Cookie變數的有效時間被設定後,在同一台電腦上執行瀏覽該ASP網頁的瀏覽器存取該Cookie變數時,卻會存取到同一個變數。
Cookie的使用 - 設定Cookie的可存取路徑 Path屬性是一個唯寫屬性,其功能為設定可存取Cookie變數之ASP網頁所在的目錄路徑,當Cookie變數被起始後,該屬性的預設值為起始變數值之ASP網頁所在的目錄路徑。 設定語法如下: Response.Cookies("變數名稱").Path = "路徑"
Cookie的使用 - 設定Cookie的可存取路徑 以下敘述將設定Personal變數僅被/NotVirDir目錄與其子目錄內的ASP網頁存取。 Response.Cookies("Personal").Path = "/NotVirDir“ 以下敘述設定Personal變數可被目前Web站台下所有ASP網頁存取。 Response.Cookies("Personal").Path = "/"
Cookie的使用 - 設定Cookie的可存取路徑 Cookie變數的Domain屬性為唯寫屬性,其功能為設定可存取Cookie變數的網站位址,語法如下: Response.Cookies("變數名稱").Domain = "位址"