450 likes | 590 Views
第十六章 Application 和 Session 物件. 張智星 jang@mirlab.org http://mirlab.org/jang 台大資工系 MIR 實驗室. 本章大綱. 大綱 本章介紹 Application 和 Session 物件的應用,並以計數器和網頁認證來進行範例說明。 主題 16-1 : Application 物件 16-2 : Session 物件 16-3 :應用範例. 16-1 : Application 物件. 本小節介紹 Application 物件的基本介紹與用法。.
E N D
第十六章Application 和 Session 物件 張智星 jang@mirlab.org http://mirlab.org/jang 台大資工系 MIR實驗室
本章大綱 • 大綱 • 本章介紹 Application 和 Session 物件的應用,並以計數器和網頁認證來進行範例說明。 • 主題 • 16-1:Application 物件 • 16-2:Session 物件 • 16-3:應用範例
16-1:Application 物件 • 本小節介紹Application物件的基本介紹與用法。
Application的基本介紹 • 動機 • HTTP 是 stateless 的 connection。 • 伺服器對每一個 request ,除了 log 記錄外,並不會留下其他特別的記錄。 • 若要在不同的 request 之間分享資訊,必須保存或傳送資料,方法如下:
Web 伺服器的執行環境 • Web 的應用程式(Application) • 虛擬目錄(由用戶端看到 Web 伺服器的第一層目錄)之下的所有 ASP 程式。 • 各地的用戶端,都可經由 Internet 呼叫同一個應用程式。 • Application 物件的用途: • 讓呼叫同一個應用程式的用戶端能接收一些共用的資訊 。
Application 物件 • 提供四種方法(Methods)、兩個事件(Events)與兩個集合(Collections)。
Application的方法 • 列表如下:
Application的事件與集合 • 事件: • 集合:
範例:訪客計數器(1) • 概念: • 一次啟動 Application 物件時,將 Application("Counter") 設定為零。 • Application.Contents(“Counter”)簡寫成Application(“Counter”) 。 • 被計數的網頁中,將 Application("Counter") 的值加一。只要每次瀏覽此網頁,Application("Counter") 值就加一。
範例:訪客計數器(2) • 步驟 • 伺服器啟動後,在Web 應用程式中,若有任一網頁被點選,相關 Application 物件會啟動。 • ASP 解譯器在虛擬目錄下尋找 global.asa 的檔案(副檔名 ASA 代表 Active Server Application)。 • 執行global.asa中的 Application_OnStart() 函數。 • 在 Application_OnStart() 函數中,我們可將變數 Application("Counter") 的值預設為零,之後若有計數網頁,將此變數值加 1。
範例:訪客計數器(3) • 缺點 • 用戶端一再點選瀏覽器的「檢視/重新整理」或是 F5 按鈕,計數器就會一直累加。 • 解決方法:用 Session 物件。 • 伺服器重開機時,Application 物件會被清除。 • 解決方法:將計數資料寫入檔案。
global.asa • 程式碼重點 • 說明 • Application_OnStart() :將變數 Application(“Counter”) 的值預設為零。
範例16-1: 計數網頁的完整範例 • 主題:使用 Application 物件的計數網頁的完整範例 • Webpage: remote host, local host • 程式碼重點 • 說明 • Application.Lock 鎖住 Application 物件,不讓其他使用者改變 Application 物件,避免同時 Requests 造成錯誤動作。 若 Application("Counter") 不存在, 則設定其為 0 鎖住 Application 物件, 不讓其他使用者改變 Application 物件的任何資訊 計數變數加1 解除 Application 物件的鎖定狀態
範例16-2: 計數網頁的簡化範例 • 主題:計數網頁的精簡範例 • Webpage: remote host, local host • 程式碼重點 • 說明 • 由於計數器只是一個小程式,發生少許誤差也無所謂,因此前一個完整的範例可改寫成此簡化的範例。 若 Application("Counter") 不存在, 則設定其為 0 計數變數加1
範例16-3: 獨立功能的計數網頁 • 主題:獨立功能的計數網頁 • Webpage: remote host, local host • 程式碼重點 • 說明 • 想將程式碼反覆用在不同的網頁,且每個網頁都有獨立的計數功能,只要將前一個範例的 “Counter” 代換為隨網頁而不同的變數。
範例16-4: 顯示計數器啟動時間 • 主題:顯示計數器啟動時間 • Webpage: remote host, local host • 程式碼重點 • 說明 • 如要知道計數器的上次啟動時間,可以使用另外一個變數Application(theStartTime) 記錄時間。 • theStartTime url 而變,可發揮獨立計數功能。 • 無論使用 JScript 或 VBScript,都可存取相同的 Application 物件與變數。 若伺服器起動後, 本網頁第一次被呼叫時的動作
範例16-5 • 主題:印出 Application.Contents 和 Application.StaticObjects • Webpage: remote host, local host • 程式碼重點 • 說明 • Application.Contents 和 Application.StaticObjects 都是 Dictionary 變數,可以直接用程式碼將其內容一一印出。
範例16-6 • 主題:刪除 Application 變數 • Webpage: remote host, local host • 程式碼重點 • 說明 • 可用 Application.Contents.Remove() 或 Application.Contents.Removeall() 刪除 Application 變數。 • 本範例刪除所有 Application 變數後,再印出 Application.Contents 和 Application.StaticObjects 的內容。
Application 相關的常見應用 • Application 相關的常見應用 • 網頁記數器。 • 線上投票區。 • 更新正確上線人數(如聊天室)。
16-2:Session 物件 • 本節介紹Session物件的基本功能與範例。
Session 的基本介紹 • 用途 • Session 物件可讓同一個使用者在不同的 Web 應用程式中共用資訊。 • 不同的 Request 中,可用 Session 物件藉著Cookies來保存資訊。 • Session 用來指定每個使用者的相關資訊。 • 條件 • 用戶端的 Cookies 功能必須是開啟的。
Application vs. Session • Application 物件和 Session物件的比較: • Application 物件:讓同一個 Web 應用程式共用資訊。 • Session 物件:讓同一個使用者在不同的 Web 應用程式中共用資訊。
Session物件 • 提供四種性質(Properties)、一種方法(Method)、兩個事件(Events)與兩個集合(Collections)。 • 作法 • 使用者點選某一個網頁時,伺服器就會對此使用者分配一個 session ID。 • 以 cookie 的方式記錄在用戶端。 • session ID 的有效期間為 20 分鐘。
Session的性質 • 列表如下:
Session的方法 • 列表如下:
Session的事件與集合 • 事件: • 集合:
範例16-7 • 主題:顯示 Session.SessionID 及 Session.Timeout • Webpage: remote host, local host • 程式碼重點 • 說明 • Session.CodePage=950代表用戶端的預設語言是繁體中文(大五碼)。 • Session.LCID=1028代表用戶端所在的區域是台灣地區。
範例16-8 • 主題:改變 Session.LCID 來改變日期格式 • Webpage: remote host, local host • 程式碼重點 • 說明 • Session.LCID 用來指定區域代碼,根據不同的區域代碼,就可產生不同的日期字串。 • 必須將 Session.LCID 設定回原預設值,否則與地區相關的顯示(如日期等)會發生錯誤。
Session_OnStart() 和 Session_OnEnd() • global.asa 檔案。 • Session 和 Application 物件都有 OnStart 和 OnEnd 。 • 執行順序: • Application和Session同時啟動,ASP 會先執行 Application_OnStart(),再執行Session_OnStart() • 若兩者同時結束,ASP 會先執行 Session_OnEnd(),再執行 Application_OnEnd() • 順序流程: • Application_OnStart() -->Session_OnStart() -->ASP scripts -->Session_OnEnd() --> Application_OnEnd()
範例:加強版訪客計數器(1) • 概念 • 使用 Session 及 Application 物件。 • 步驟 • 檢查 Session("PreviouslyOnLine")值,若是 false,則將其值改true,並將 Application("Counter") 加一。 • Application(“Counter”) 的值即代表此網頁被點選的次數。不因使用者短期(20分鐘)內點選「重新整理」而增加。
範例:加強版訪客計數器(2) • 優點 • 用戶端點選「重新整理」計數器值不會一再累加。 • 缺點: • 伺服器重開機時,Application 物件會被清除,所有的計數資料將消失。 • 解決方法:將計數資料寫入檔案。
範例16-9 • 主題:防止計數資料的竄改-方法一 • Webpage: remote host, local host • 程式碼重點 • 說明 • 本範例使用Session(“PreviouslyOnLine”) 的值,若是 false,則將值改為 true,並將 Application("Counter") 值加一。
範例16-10 • 主題:防止計數資料的竄改-方法二 • Webpage: remote host, local host • 說明 • 加上「獨立計數」、「計數器啟用時間」等功能,得到更完整的範例。
範例16-11 • 主題:記錄每日來訪人數(一天寫檔一次) • Webpage: remote host, local host • 程式碼重點 • 說明 • 將計數資料分為「頁次」和「人次」: • 頁次:網頁被點選的次數。 • 人次:網頁被不同的訪客點選的次數。 • 不會由於伺服器當機,造成所有計數資料流失。 • 寫檔的動作不是很頻繁,伺服器效能較不會降低。
Session 物件其他相關應用 • 購物網站的購物車的應用 • 利用 Session 變數來記錄使用者所購買的物品、數量、價格等。 • 認證一次就能悠遊各個網頁 • 使用 Session 變數記錄認證是否成功,之後在不同的網頁檢查此變數即可,不需重複認證。 • 強迫一定要從網站的首頁進入 • 使用者從網站的首頁進入時,必須設定某一個特定的 Session 變數。系統會檢查此 Session 是否存在,若非,則轉址到網站的首頁。
16-3:應用範例 • 本節將使用「密碼認證」為範例,說明如何整合 client-side script 及 server-side script,以達到方便的密碼認證功能。
範例介紹 • 特色 • 不需用到 IIS 或伺服器作業系統本身的認證功能,也不需管理者(Administrator)權限即可使用。 • 使用方便,只需在被密碼保護的網頁導入(Include)一個檔案即可。 • 用session變數,每次認證後有效時間為 20 分鐘。 • 名詞解釋 • 目標網頁:被密碼保護的網頁。 • 來源網頁:包含「目標網頁」連結的網頁。
範例16-12(1) • 主題:由Session變數保存密碼認證 • 功能說明 • 使用者輸入正確的帳號密碼,則設定 Session("ok")為 true,同時在原視窗開啟目標網頁,並關閉認證視窗。 • 若帳號密碼不正確,則在認證視窗顯示原來的認證畫面。
範例16-12(2) • 使用步驟 • 使用者點選「秘密網頁」,就會開啟密碼認證視窗(見右上圖)。 • 正確的帳號和密碼填在文字欄位,點選「送出」,認證視窗會被關掉,並在原視窗顯示「秘密網頁」(見右下圖)。
範例16-12(3) • 範例各檔案說明與連結 • source.asp執行結果檢視原始碼此網頁包含目標網頁(target.asp)的連結。 • target.asp執行結果檢視原始碼目標網頁(被密碼保護之網頁),第一列程式碼即導入 auth.inc,以達到被密碼保護功能。 • auth.inc本頁任務為檢驗認證資訊是否存在: • 若存在,則不做任何事。 • 若不存在,則跳出認證視窗(auth.asp),請求輸入密碼,並在原視窗載入來源網頁(source.asp)。 • 需要密碼保護之網頁,導入此檔案,即可被保護。
範例16-12(4) • auth.asp執行結果檢視原始碼此頁之目的為進行密碼認證: • 若通過,則於原視窗開啟目標網頁(target.asp)。 • 若不通過,則請求重新輸入帳號、密碼。 • delauth.asp本頁之任務為消除認證資訊(即將變數 session("ok")設定為 False),並載入來源網頁(source.asp)。
範例16-12(5) • 執行流程 • 使用者從 source.asp (來源網頁)中點選 target.asp(目標網頁)。 • target.asp 檢查是否有已過正確認證(且時間不超過 20 分鐘),此資訊保留在 session("ok")。若此變數為 True,則顯示 target.asp。 • 若 session(“ok”) 為 False,則需要認證,此時跳出密碼認證網頁,並在原視窗載入 source.asp。 • 使用者在認證視窗輸入認證資訊,若錯誤,保持認證視窗開啟,並繼續要求認證資訊。 • 獲得正確認證資訊,則關閉認證視窗,設定 session("ok") 為 True,並在原視窗開啟 target.asp。
範例16-12(6) 「密碼保護網頁」程式流程 點選「秘密網頁」連結 嘗試在主視窗 載入目標網頁target.asp 設定 Session(" ok" )=true 由目標網頁 target.asp 所導入的auth.inc 來檢查 Session(“ok”) 是否為true? yes 在主視窗 顯示來源網頁 source.asp 跳出新視窗 載入 auth.asp 索取認證資訊 檢查帳號密碼 是否正確? no no yes 在主視窗 顯示目標網頁target.asp
範例16-12(7) • 說明 • 由auth.inc 負責認證。 • auth.inc檔中定義兩個函數,分別在用戶端與伺服端執行。 • getPassword:開啟新視窗,載入 auth.asp,以取得使用者的認證資訊。(這是用戶端執行的函數,只在認證資訊不存在時,才在用戶端被呼叫。) • authentication:在伺服器確認認證資訊是否已經存在於 sessionVariable。 • 存在:則直接回傳目標網頁。 • 不存在:則於回傳的網頁內加入用戶端的 JavaScript程式碼,以便跳出認證視窗。