44
第第第第 Application 第 Session 第第 第第第 [email protected] http://mirlab.org/jang 第第第第第 MIR 第第第

第十六章 Application 和 Session 物件

  • Upload
    ting

  • View
    103

  • Download
    3

Embed Size (px)

DESCRIPTION

第十六章 Application 和 Session 物件. 張智星 [email protected] http://mirlab.org/jang 台大資工系 MIR 實驗室. 本章大綱. 大綱 本章介紹 Application 和 Session 物件的應用,並以計數器和網頁認證來進行範例說明。 主題 16-1 : Application 物件 16-2 : Session 物件 16-3 :應用範例. 16-1 : Application 物件. 本小節介紹 Application 物件的基本介紹與用法。. - PowerPoint PPT Presentation

Citation preview

Page 1: 第十六章 Application  和  Session  物件

第十六章Application 和 Session 物件

張智星[email protected]

http://mirlab.org/jang台大資工系 MIR實驗室

Page 2: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 本章大綱 大綱

本章介紹 Application 和 Session 物件的應用,並以計數器和網頁認證來進行範例說明。 主題

16-1 : Application 物件 16-2 : Session 物件 16-3 :應用範例

2/45

Page 3: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境16-1 : Application 物件

本小節介紹 Application 物件的基本介紹與用法。

3/45

Page 4: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Application 的基本介紹

動機 HTTP 是 stateless 的 connection 。 伺服器對每一個 request ,除了 log 記錄外,並不會留下其他特別的記錄。

若要在不同的 request 之間分享資訊,必須保存或傳送資料,方法如下:方法 溝通對象

Cookies 一個用戶端和伺服器之間的資料傳遞和保存 Form 經由表單進行網頁間的資料傳遞和保存

Application 物件 一個 Web 應用程式和各用戶端間的資料傳遞和保存 Session 物件 一個用戶端和各 Web 應用程式間的資料傳遞和保存 4/45

Page 5: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Web 伺服器的執行環境

Web 的應用程式( Application ) 虛擬目錄(由用戶端看到 Web 伺服器的第一層目錄)之下的所有 ASP 程式。

各地的用戶端,都可經由 Internet 呼叫同一個應用程式。 Application 物件的用途:

讓呼叫同一個應用程式的用戶端能接收一些共用的資訊 。 5/45

Page 6: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Application 物件

提供四種方法( Methods )、兩個事件( Events )與兩個集合( Collections )。

6/45

Page 7: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Application 的方法

列表如下:方法 說明 Lock

鎖住 Application 物件,不讓其他使用者改變 Application 物件的任何資訊 Unlock 解除 Lock 狀態

Contents.Remove

(item or index) 從 Contents 集合中刪除一個項目

Contents.RemoveAll 從 Contents 集合中刪除所有項目

7/45

Page 8: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Application 的事件與集合

事件:

集合:

事件 說明 OnStart

啟動一個 Application 物件時所觸發的函數,此函數必須放在 global.asa 檔案 OnEnd

結束一個 Application 物件時所觸發的函數,此函數必須放在 global.asa 檔案 集合 說明

Contents 以程式碼加在 Application 物件的所有變數的集合 StaticObjects 以 Object 標籤加在 Application 物件的所有物件的集合

8/45

Page 9: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例:訪客計數器 (1) 概念:

1) 一次啟動 Application 物件時,將 Application("Counter") 設定為零。

Application.Contents(“Counter”) 簡寫成Application(“Counter”) 。

2) 被計數的網頁中,將 Application("Counter") 的值加一。只要每次瀏覽此網頁, Application("Counter") 值就加一。

9/45

Page 10: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例:訪客計數器 (2) 步驟

伺服器啟動後,在 Web 應用程式中,若有任一網頁被點選,相關 Application 物件會啟動。 ASP 解譯器在虛擬目錄下尋找 global.asa 的檔案(副檔名 ASA 代表 Active Server Application )。 執行 global.asa 中的 Application_OnStart() 函數。

在 Application_OnStart() 函數中,我們可將變數 Application("Counter") 的值預設為零,之後若有計數網頁,將此變數值加 1 。

10/45

Page 11: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例:訪客計數器 (3) 缺點

用戶端一再點選瀏覽器的「檢視 / 重新整理」或是 F5 按鈕,計數器就會一直累加。 解決方法:用 Session 物件。

伺服器重開機時, Application 物件會被清除。 解決方法:將計數資料寫入檔案。

11/45

Page 12: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境global.asa

程式碼重點

說明 Application_OnStart() :將變數

Application(“Counter”) 的值預設為零。

' Application 物件啟動時該做的事 Sub Application_OnStart() Application("Counter") = 0 End Sub

12/45

Page 13: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-1: 計數網頁的完整範例 主題:使用 Application 物件的計數網頁的完整範例

Webpage: remote host, local host 程式碼重點

說明 Application.Lock 鎖住 Application 物件,不讓其他使用者改變 Application 物件,避免同時 Requests 造成錯誤動作。

if (Application("Counter")==null) Application("Counter")=0;

function PageHitCounter(){ Application.Lock; Application("Counter")++; Application.UnLock; return(Application("Counter"));

}

13/45

若 Application("Counter") 不存在,則設定其為 0

鎖住 Application 物件,不讓其他使用者改變Application 物件的任何資訊

解除 Application 物件的鎖定狀態 計數變數加 1

Page 14: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-2: 計數網頁的簡化範例 主題:計數網頁的精簡範例

Webpage: remote host, local host 程式碼重點

說明 由於計數器只是一個小程式,發生少許誤差也無所謂,因此前一個完整的範例可改寫成此簡化的範例。

14/45

<% if (Application("Counter")==null)Application("Counter") = 0; %>

<h3 align=center> 您是第 <font color=red><%=++Application("Counter")%></font> 位貴賓! </h3>

若 Application("Counter") 不存在,則設定其為 0

計數變數加 1

Page 15: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-3: 獨立功能的計數網頁 主題:獨立功能的計數網頁

Webpage: remote host, local host 程式碼重點

說明 想將程式碼反覆用在不同的網頁,且每個網頁都有獨立的計數功能,只要將前一個範例的 “ Counter” 代換為隨網頁而不同的變數。

url = Request.ServerVariables("URL"); if (Application(url) == null) Application(url) = 0;

15/45

Page 16: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-4: 顯示計數器啟動時間 主題:顯示計數器啟動時間

Webpage: remote host, local host 程式碼重點

說明 如要知道計數器的上次啟動時間,可以使用另外一個變數

Application(theStartTime) 記錄時間。 theStartTime url 而變,可發揮獨立計數功能。 無論使用 JScript 或 VBScript ,都可存取相同的

Application 物件與變數。16/45

url = Request.ServerVariables("URL");theStartTime = "startTime: " + url;if (Application(theStartTime) == null){

Application(url) = 0;now = new Date();Application(theStartTime) =

now.toLocaleString();}

若伺服器起動後,本網頁第一次被呼叫時的動作

Page 17: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-5 主題:印出 Application.Contents 和

Application.StaticObjects Webpage: remote host, local host 程式碼重點

說明 Application.Contents 和

Application.StaticObjects 都是 Dictionary 變數,可以直接用程式碼將其內容一一印出。

<%listdict(Application.Contents,"Application.Contents"); %> <%listdict(Application.StaticObjects,"Application.StaticObjects");%>

17/45

Page 18: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-6 主題:刪除 Application 變數

Webpage: remote host, local host 程式碼重點

說明 可用 Application.Contents.Remove() 或

Application.Contents.Removeall() 刪除 Application 變數。

本範例刪除所有 Application 變數後,再印出 Application.Contents 和 Application.StaticObjects 的內容。

<% Application.Contents.Removeall()%>

18/45

Page 19: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Application 相關的常見應用

Application 相關的常見應用 網頁記數器。 線上投票區。 更新正確上線人數(如聊天室)。

19/45

Page 20: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境16-2 : Session 物件

本節介紹 Session 物件的基本功能與範例。

21/45

Page 21: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Session 的基本介紹

用途 Session 物件可讓同一個使用者在不同的 Web 應用程式中共用資訊。 不同的 Request 中,可用 Session 物件藉著

Cookies 來保存資訊。 Session 用來指定每個使用者的相關資訊。

條件 用戶端的 Cookies 功能必須是開啟的。

22/45

Page 22: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Application vs. Session

Application 物件和 Session 物件的比較: Application 物件:讓同一個 Web 應用程式共用資訊。 Session 物件:讓同一個使用者在不同的 Web 應用程式中共用資訊。

23/45

Page 23: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Session 物件

提供四種性質( Properties )、一種方法( Method )、兩個事件( Events )與兩個集合( Collections )。

作法 使用者點選某一個網頁時,伺服器就會對此使用者分配一個 session ID 。 以 cookie 的方式記錄在用戶端。 session ID 的有效期間為 20 分鐘。

24/45

Page 24: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Session 的性質

列表如下:性質 說明

CodePage 語言識別碼(例: 950 代表繁體中文、 936 代表簡體中文、 65001 代表 UTF-8 )

LCID 地區識別碼(例: 1028 代表台灣地區、 3076 代表香港地區、 2052 代表大陸地區)

SessionID 用戶端的 SessionID

Timeout Session 物件的有效時間(以分鐘為單位),預設為20 分鐘

25/45

Page 25: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Session 的方法

列表如下:方法 說明

Abandon 刪除 Session 物件所含的所有資訊 Contents.Remove(item or

index) 刪除 Contents 集合中的某一個項目

Contents.RemoveAll 刪除 Contents 集合中的所有項目

26/45

Page 26: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Session 的事件與集合

事件:

集合:

事件 說明 OnStart 啟動一個 Session 物件時所觸發的函式,此函式必須放在 global.asa 檔案 OnEnd 結束一個 Session 物件時所觸發的函式,此函式必須放在 global.asa 檔案

集合 說明 Contents 所有加在 Session 物件的變數集合

StaticObjects 所有在使用者層級( Session Scope )所宣告的物件集合27/45

Page 27: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-7 主題:顯示 Session.SessionID 及 Session.Timeout

Webpage: remote host, local host 程式碼重點

說明 Session.CodePage=950 代表用戶端的預設語言是繁體中文(大五碼)。 Session.LCID=1028 代表用戶端所在的區域是台灣地區。

<%=Session.SessionID%><%=Session.Timeout%>

28/45

Page 28: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-8 主題:改變 Session.LCID 來改變日期格式

Webpage: remote host, local host 程式碼重點

說明 Session.LCID 用來指定區域代碼,根據不同的區域代碼,就可產生不同的日期字串。 必須將 Session.LCID 設定回原預設值,否則與地區相關的顯示(如日期等)會發生錯誤。

currentLcid=Session.LCID; // 記錄目前的 LCID Session.LCID=1028;

29/45

Page 29: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 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()

30/45

Page 30: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例:加強版訪客計數器 (1) 概念

使用 Session 及 Application 物件。 步驟

檢查 Session("PreviouslyOnLine") 值,若是 false ,則將其值改 true ,並將 Application("Counter") 加一。

Application(“Counter”) 的值即代表此網頁被點選的次數。不因使用者短期( 20 分鐘)內點選「重新整理」而增加。31/45

Page 31: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例:加強版訪客計數器 (2) 優點

用戶端點選「重新整理」計數器值不會一再累加。 缺點:

伺服器重開機時, Application 物件會被清除,所有的計數資料將消失。 解決方法:將計數資料寫入檔案。

32/45

Page 32: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-9 主題:防止計數資料的竄改 - 方法一

Webpage: remote host, local host 程式碼重點

說明 本範例使用 Session(“PreviouslyOnLine”) 的值,若是

false ,則將值改為 true ,並將 Application("Counter") 值加一。

if (Session("PreviouslyOnLine")!=true){ Application(“Counter”)++; Session("PreviouslyOnLine") = true;}

33/45

Page 33: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-10 主題:防止計數資料的竄改 - 方法二

Webpage: remote host, local host 說明

加上「獨立計數」、「計數器啟用時間」等功能,得到更完整的範例。

34/45

Page 34: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-11 主題:記錄每日來訪人數 ( 一天寫檔一次 )

Webpage: remote host, local host 程式碼重點

說明 將計數資料分為「頁次」和「人次」:

頁次:網頁被點選的次數。 人次:網頁被不同的訪客點選的次數。

不會由於伺服器當機,造成所有計數資料流失。 寫檔的動作不是很頻繁,伺服器效能較不會降低。

if (today.getDate()!=Application("counterDate")){ // 若不在同一天,則將資料寫入檔案 fid = fso.OpenTextFile(Server.MapPath(counterFile), 8, true); // 8 代表附加資料於檔案, true 代表若無檔案則新增

35/45

Page 35: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境Session 物件其他相關應用

購物網站的購物車的應用 利用 Session 變數來記錄使用者所購買的物品、數量、價格等。

認證一次就能悠遊各個網頁 使用 Session 變數記錄認證是否成功,之後在不同的網頁檢查此變數即可,不需重複認證。

強迫一定要從網站的首頁進入 使用者從網站的首頁進入時,必須設定某一個特定的

Session 變數。系統會檢查此 Session 是否存在,若非,則轉址到網站的首頁。 36/45

Page 36: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境

16-3 :應用範例 本節將使用「密碼認證」為範例,說明如何整合 client-side script 及 server-side

script ,以達到方便的密碼認證功能。

37/45

Page 37: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例介紹 特色

不需用到 IIS 或伺服器作業系統本身的認證功能,也不需管理者( Administrator )權限即可使用。 使用方便,只需在被密碼保護的網頁導入( Include )一個檔案即可。 用 session 變數,每次認證後有效時間為 20 分鐘。

名詞解釋 目標網頁:被密碼保護的網頁。 來源網頁:包含「目標網頁」連結的網頁。

38/45

Page 38: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-12(1) 主題:由 Session 變數保存密碼認證 功能說明

使用者輸入正確的帳號密碼,則設定 Session("ok") 為 true ,同時在原視窗開啟目標網頁,並關閉認證視窗。

若帳號密碼不正確,則在認證視窗顯示原來的認證畫面。

39/45

Page 39: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-12(2) 使用步驟

1. 使用者點選「秘密網頁」,就會開啟密碼認證視窗 (見右上圖 ) 。

2. 正確的帳號和密碼填在文字欄位,點選「送出」,認證視窗會被關掉,並在原視窗顯示「秘密網頁」(見右下圖 ) 。40/45

Page 40: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-12(3) 範例各檔案說明與連結

source.asp 執行結果 檢視原始碼此網頁包含目標網頁( target.asp )的連結。 target.asp 執行結果 檢視原始碼目標網頁(被密碼保護之網頁),第一列程式碼即導入

auth.inc ,以達到被密碼保護功能。 auth.inc本頁任務為檢驗認證資訊是否存在:

若存在,則不做任何事。 若不存在,則跳出認證視窗( auth.asp ),請求輸入密碼,並在原視窗載入來源網頁( source.asp )。 需要密碼保護之網頁,導入此檔案,即可被保護。

41/45

Page 41: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-12(4) auth.asp 執行結果 檢視原始碼此頁之目的為進行密碼認證:

若通過,則於原視窗開啟目標網頁( target.asp )。 若不通過,則請求重新輸入帳號、密碼。

delauth.asp本頁之任務為消除認證資訊(即將變數 session("ok")設定為 False ),並載入來源網頁( source.asp )。

42/45

Page 42: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-12(5) 執行流程

1. 使用者從 source.asp (來源網頁)中點選 target.asp (目標網頁)。

2. target.asp 檢查是否有已過正確認證(且時間不超過 20 分鐘),此資訊保留在 session("ok") 。若此變數為 True ,則顯示 target.asp 。

3. 若 session(“ok”) 為 False ,則需要認證,此時跳出密碼認證網頁,並在原視窗載入 source.asp 。 4. 使用者在認證視窗輸入認證資訊,若錯誤,保持認證視窗開啟,並繼續要求認證資訊。 5. 獲得正確認證資訊,則關閉認證視窗,設定

session("ok") 為 True ,並在原視窗開啟 target.asp 。43/45

Page 43: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-12(6)           

嘗試在主視窗載入目標網頁 target.asp

在主視窗顯示目標網頁 target.asp

由目標網頁target.asp所導入的 auth.inc 來檢查

Session(“ok”)是否為 true?

跳出新視窗載入 auth.asp索取認證資訊檢查帳號密碼是否正確?

在主視窗顯示來源網頁source.asp

yes

no

no

yes

設定 Session(" ok" )=true

點選「秘密網頁」連結 「密碼保護網頁」程式流程

44/45

Page 44: 第十六章 Application  和  Session  物件

JavaScript 程式設計與應用:用於伺服器端的 ASP環境 範例 16-12(7) 說明

由 auth.inc 負責認證。 auth.inc 檔中定義兩個函數,分別在用戶端與伺服端執行。

getPassword :開啟新視窗,載入 auth.asp ,以取得使用者的認證資訊。 (這是用戶端執行的函數,只在認證資訊不存在時,才在用戶端被呼叫。 ) authentication :在伺服器確認認證資訊是否已經存在於

sessionVariable 。 存在:則直接回傳目標網頁。 不存在:則於回傳的網頁內加入用戶端的 JavaScript程式碼,以便跳出認證視窗。

45/45