程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP入門教程 >> ASP 3.0高級編程(六)

ASP 3.0高級編程(六)

編輯:ASP入門教程
第3章 ASP應用程序與會話

在前面的章節中介紹了ASP提供的訪問一個客戶請求和產生響應的方法,本章將討論ASP的另兩個對象。就是application和 session對象。這兩個對象不是直接地與請求和響應的管理有關,而是更多地與ASP網頁運行環境的管理相關。
與建立Web站點或Web應用程序有關的共同問題之一,是使用HTTP協議時沒有狀態。狀態提供了與一個指定用戶有關的變量值、對象和其他資源,並且應用程序中的任意例程都能使用它;以一種像VB或C++這樣的程序設計語言編寫一般的基於客戶的應用程序時,使用狀態可以完成一些相應的工作。然而,Web並不提供這種能力。在本章中,讀者將看到為什麼和如何避免這個問題。
本章還涉及到一些術語和技術問題。它迄今為止,本書中已經簡單地討論了“Web應用程序”,但沒有真正確切地理解或准確定義它們到底是什麼。本書也涉及到了“用戶會話”,也沒有相應的比較完全的描述。前面有意地省略這方面的內容,因為它們與ASP的應用程序和會話密切相關。下面將介紹ASP的Application和Session對象。
本章研究的主要內容:
· Web應用程序是什麼,以及它們如何與ASP Application對象相聯系。
· ASP如何自動地創建和管理應用程序和會話。
· Application和Session對象提供的功能。
· 如何把Application和Seesion對象放入ASP網頁中。
首先研究整個內容的核心問題:狀態。

3.1 Web上的狀態管理
    許多開發人員把應用程序傳送到Web之前從來沒考慮狀態的概念。正如前面說過的,Web是一個無狀態的環境。因此應該探討一下狀態是什麼,了解能夠避免產生問題的方法。

3.1.1狀態的准確定義
    在單用戶程序中,創建一個可執行的應用程序時,例如使用VB建立一個.exe文件,可以聲明一個全局(或Public)變量,然後在代碼中任何地方可對其進行訪問。在應用程序運行的所有時刻,時刻值一直是有效,並且是可訪問的。
    對於一個傳統的客戶機/服務器解決方案,例如一個基於客戶機的應用程序對一個基於服務器的數據庫引擎進行訪問的系統,每個客戶端建立了一個與服務器和數據庫應用程序的連接。這種連接通常是通過驗證用戶的方法來建立的。
    驗證過程是典型的識別用戶身份的過程,通過一個用戶名和口令組合來證明是否為合法的用戶。
    一旦通過驗證,在客戶端和基於服務器的應用程序之間就建立了連接,該連接在用戶使用該應用程序的所有時間內一直保持有效。當用戶注冊到酵Windows 2000服務器上時,這一切便會發生。無論何時,管理員使用 “Active Directory Users and Computers”實用程序(單擊“Start”菜單的“Administrative Tools”選項中的 “Directory Management”項)都可以觀察到活動的用戶連接。這個過程在許多系統中都相同,例如Microsoft SQL Server。
    這種永久的連接意味著:當用戶發送指令或請求到服務器上時,服務器會很容易地識別每個用戶。同樣服務器的響應或任何其他用戶的信息也能直接返回用戶。要進一步指出的是服務器可以比較容易地存儲與每個客戶相關的值和信息,並在需要的時候提供給相應的客戶。當然,服務器應用程序能夠擁有主全局變量,以便於用戶在需要的時候進行訪問。
    這種識別每個客戶端的請求並在內存中保存相關用戶的值的能力構成狀態。可以認為狀態代表應用程序的值、環境以及用戶的內部變量,並貫穿於應用程序和用戶連接的整個過程。

3.1.2 狀態的重要性
    如果打算創建與用戶進行交互的基於Web站點的應用程序,而不是僅顯示獨立頁面的Web網站,必須能夠為每個用戶提供獨立的狀態。這可能只是記住他們的名字,也可能要為每個用戶存儲對象引用或不同的記錄集。如果不能這樣做,ASP網頁就不能做更多的事情,因為該頁面執行完成時,頁面中的變量和其他相關資料都破壞了。錄用戶請求下一個頁面時,這個頁面提供的所有信息將全部失去。
    因此,需要找到一種方法,保存每個訪問者的狀態。能夠存儲對所有用戶而言的全局值是非常重要。例如,一個Web風格的訪問或頁面點擊計數器,它不為每個用戶提供自己的計數器,用戶們通常想要看到訪問者的總數,而不僅僅是他們自己訪問的次數。訪問者的數目需要與應用程序級狀態一起存儲,而不是與用戶級狀態一起存儲。 
    這不是一個剛出現的問題,自從商用站點占據了Web,就已經存在,甚至更早些。所以已有許多在Web上存儲狀態的傳統的解決方案。Web站點管理員想要了解訪問者以前是否曾訪問過他們的網站,如果訪問過,訪問過多少次?還定期訪問其他什麼網站等。這樣可以更好地制定其廣告目標。所有這些都要求一種方法來存儲有關用戶在訪問時所產生的網頁請求或每次訪問間的信息。

3.1.3在Web上創建狀態
    在頁面請求和站點訪問之間提供狀態常用的方法是通過cookie。我們在前面的章節中已經看到,如何在客戶端的計算機中存放相應的值,這些值與每個頁面請求一起發送給對此cookIE有效的域。通過用ASP檢查和更新cookIE,在某種程度上能夠保持一個狀態。可以使用所包含的信息來識別用戶,然後把用戶連接到一個已存儲相應值的集合。
    例如,可以檢測一個用戶請求是否包含一個站點指定的cookie。如果不包含,則為該用戶分配一個某種類型的標識,指明一個數量,並存儲在帶有一個長有效期的cookie中。以後該用戶對這個站點的每一次訪問,都能夠檢測到cookIE並更新所包含的信息。同時可以收集有關訪問的次數和持續時間的數據,並存儲在服務器上,以備將來使用。
    但是,如果用戶轉移到另一個計算機,或刪除了cookie,或者他們的浏覽器拒絕接收發送給他們的cookie,會發生什麼事情呢?在這種情況下,不能維持狀態,因為下一次不能識別他們現在,Web上有許多cookIE,大多數人會接受它們,而不加理會。如果打開浏覽器中的“Warn before accepting cookIEs”選項,接著漫游幾個大的站點,你就會明白其中的含意。
1.  匿名訪問者與授權的訪問者
如果認為cookIE是一個有點草率的解決方案,可以使用更直接的方法。許多站點采用的一種方法是,在訪問者點擊一個站點時,或者點擊一個要求驗證身份的頁面時,彈出一個進行登錄的對話框。訪問者首先必須進行注冊,獲得一個某種類型的用戶名/口令的組合,才能允許訪問相應的站點或頁面。
為了證實訪問者是一個已知的並且合法的用戶,在訪問者的計算機上放置的一個cookIE,它或者保存注冊的詳細數據,或者是一把表明已驗證過身份的“鑰匙(key)”。同時,訪問者的詳細數據永久地保存在服務器上,准備再次訪問時使用。如果訪問者的浏覽器中有了這樣一個cookIE,他就可以自由地訪問該網站,因為已經驗證過了。
如果cookie沒有有效期限(Expires),cookIE的值在關閉浏覽器時自動消失,在下一次訪問時必須重新注冊和再次驗證。當然,如果拒絕接收cookie或刪除了cookIE,就只能再次得到注冊對話框。這樣的話,如果不被識別,就不能訪問該站點。
通過強制用戶就像注冊到自己的網絡一樣注冊到Web服務器,Windows 2000整體安全性能為IIS提供更強和更安全的驗證功能。但是,這只能與Internet Explorer 3.0和之上版本的浏覽器一起工作。IIS也可以使用BASIC驗證允許非Microsoft浏覽器注冊Web服務器。
2.  不再有匿名訪問者
在IIS Web服務器上使用ASP時,除非用戶離開該站點到另一個網站或者關閉了浏覽器,否則能在當前會話中跟蹤用戶。在本章的後面,將看到如何使用這個功能來標識一個訪問者、存儲用戶的本地信息和提供狀態。下面與已經討論過的解決方案相比較,討論其工作方式。
ASP和IIS共同提出了一個用戶會話的概念,通過ASP Session對象進行交互。在每個訪問者第一次訪問服務器上的一個ASP 網頁時,為他創建一個新的並且獨立的會話對象,分配給該會話一個會話標識號,並把包含會話標識符的特殊加密版本的一個cookIE發送給客戶。
cookie的路徑(參看前面的章節有關cookIE屬性的描述)設置為運行在服務器上的ASP應用程序的根路徑。這很可能上缺省的Web網站的根目錄(即“/”),但也可能會是另外一個值(稍後會看到)。在cookIE中沒有提供Expires值,所以當浏覽器關閉時,cookIE值也就消失。
每當這個用戶訪問這個ASP網頁,ASP都會查找這個cookIE。命名為ASPSESSIONIDxxxxxxxx,其中每個x是一個字母字符。從第2章圖2-7所示的ServerVariables集合,能夠在HTTP報頭中看到它。這裡高亮地顯示ASP cookIE,如圖3-1所示:

圖3-1 顯示的cookIE值
但是,這個cookie不會出現在 Request.Cookies或Response.CookIEs集合中,ASP把它隱藏起來,但仍保存在浏覽器上。對於每個ASP網頁請求,ASP都要查看該值。這個cookIE包含的值,指明了這個用戶的會話。因此,相應的Session對象(該對象在內存中已被處理,並且一直包含所有在前一頁面請求過程中進行操作的值)的內容可以移交給ASP網頁中的腳本。
當然,如前所述,如果客戶浏覽器不接收或不支持這些cookIE,這個處理將失敗。在這種情況下,不能創建ASP會話,對這個訪問者的狀態也不進行自動維護。

3.2 Web應用程序的定義
    前面的章節中已經多次使用過Web應用程序(Web Application)術語,所指的既不是一個真正意義上的Web網站,又不是一個傳統的應用程序。換句話說,而是認為它是一些Web網頁和用來完成某些任務的其他資源的一個集合。它隱含這樣一層意思:有一個預定義的路線貫穿於網頁之中,用戶可做出選擇或提供信息使任務能夠完成。 
    例如,一個在線商店,你為了購買貨物,進行反復的觀察和選擇,浏覽一系列網頁,收集所需要的信息,支付相應的費用,最後發出定單。也可能是一個“軟件升級向導”,指導用戶完成下載和安裝新軟件的過程,或者可能是一個基於Intranet的報價單或銷售報告的生成工具。
    所有這些不同於“標准”的Web網站,一般的Web站點使用一系列菜單或導航欄以預先未定義的路徑漫游該站點。但是一個Web應用程序遠不只是受控制的導航器。自由地漫游於一個Web網站時,可以進行無狀態的和匿名的訪問,但Web應用程序一般不接受。

3.2.1 ASP應用程序的定義
    上述內容可以認為是術語“Web應用程序”的一個合理的一般定義,但遺憾的是,在談論有關 “ASP應用”時,僅這些還不夠。回答什麼是“Web應用”可以是主觀的,而回答什麼是“ASP應用”則需要從技術上的解釋。在ASP中術語“應用程序”有自己特定的含義,在討論如何實現之前,弄懂這個概念至關重要。
    ASP應用程序與兩個主要的內容有關:
    · 全局范圍的規定,具有一個全局可訪問的變量存儲區域。
    · 通過COM+與IIS的集成,可更好地管理組件。
    下面討論這些內容。第二個內容涉及到其他ASP對象,其覆蓋范圍相應廣泛。在下一章研究ASP Server對象時,將對這部分內容進行詳細地討論。
1.     提供Web應用程序的全局范圍
ASP提供一個Application對象,基本上與前面討論的Session對象相當。但是,這是在應用程序層而不是在用戶層。換句話說,該對象是全局的,不是對單獨用戶的,而是對應用程序的所有用戶,其作用域不限制為單獨用戶的訪問。這與在一個正常的可執行應用程序中的全局(或Public)變量相同。Application對象可用於在全局環境中存儲變量和信息(即狀態),該應用程序內的任何ASP網頁中運行的腳本都可訪問這些值,而不管是哪個訪問者發出的請求。
但是,這沒有回答主要問題:什麼是一個ASP應用程序?為此,需要研究ASP內部的一些情況。
當用戶請求一個ASP網頁時,IIS通過實例化asp.dll(用來實現ASP)創建一個環境(如第1章所述)。將該頁面解釋為服務器端腳本,相應的腳本引擎的實例用來執行該腳本。
實例化的asp.dll初如事件啟動一個ASP應用程序,創建一個Application對象。然後,為這個用戶啟動一個會話,並創建單獨的Session對象。當更多的會話啟動時,這個Application對象保留在作用域中(即已經實例化和可用)。一旦最後保持活動的會話結束,該應用程序就結束,並取消相應的Application對象。
(1)  缺省的ASP應用
Windows 2000在安裝IIS和ASP時,創建一個缺省的Web站點。它被配置成一個ASP應用程序,涉及到在PRoperties對話框中針對站點根目錄文件夾(缺省為C:\Inetpub\WWWRoot)的一些設置。圖3-2所示是缺省Web站點的PropertIEs對話框的屏幕。

圖3-2 缺省Web網站的PropertIEs對話框
涉及到ASP應用程序的文件之一是global.asa。這個文件用於定制應用程序行為的方式。放置在應用程序的根目錄下,可用於該目錄下的所有子目錄。因此,如果它放置在整個Web站點的根目錄下,則定義整個網站作為缺省的ASP應用程序的一部分。
在本章後面有關應用程序和會話事件的部分中,將看到這個文件及其使用方法。
(2)  ASP虛擬應用程序
如同在設置過程中創建缺省的應用程序一樣,可以在該Web網站的任何子目錄中創建屬於自己的ASP虛擬應用程序。這個應用程序包含作為“應用程序目錄”而定義的目錄中所有的子目錄。並且,這個目錄和子文件夾也都是缺省應用程序的一部分,共享由缺省的Application對象創建的全局空間。
事實上,在缺省的應用程序中存儲的所有變量在子目錄中的應用程序中也都是可用的。然而,如果該子目錄應用程序中的一個ASP網頁把一個值寫入Application對象,而Application對象與缺省(根)應用程序中已存在的一個值有相同的名字,那麼,原先的值在子目錄應用程序中就不能再用。但是在其他的應用程序或ASP網頁中,將保留原有的值,因為根目錄的應用程序不能訪問子目錄應用中的值。
從一個子程序或函數的變量的角度考慮這個問題。如果定義一個變量intMyValue為Public或全局的變量,可以從任何的子程序或函數內部訪問該變量。但是,如果又聲明一個具有相同名字的局部變量,並在該子程序或函數內對該變量進行引用,則得到此變量的局部值。不能再訪問原先的值。當子程序或函數結束,局部值被撤消,全局變量原有的值仍然保留著:
Public intMyValue = 42
Function DOSomething()
    Response.Write intMyValue   ‘Gives 42 from global variable
    Dim intMyValue
    IntMyValue = 17
    Response.Write intMyValue   ‘Gives 17 from new local variable,but
                   ;              ‘the global value of MyValue is still 42
End Function
(3)  創建自己的ASP虛擬應用程序
為了建立一個新的虛擬應用程序,使用Internet Services Manager應用程序或具有相同功能的Html Web Manager網頁。在 Internet Services Manager中,在要創建的虛擬應用程序的目錄上單擊右鍵,並選擇New,接著選擇Virtual Directory,屏幕如圖3-3所示:

圖3-3 創建ASP虛擬應用程序的屏幕
這個操作啟動New Virtual Directory Wizard,該向導的開始屏幕提供有關向導的操作信息。單擊Next,在第二頁中鍵入新的虛擬應用程序的名字(或別名)。這個名字與Internet Services Manager中選擇的目錄的路徑聯合起來,將成為該應用程序的URL。屏幕如圖3-4所示:

圖3-4 New Virtual Directory Wizard的屏幕
為了把一個現有的目錄轉換為與該目錄具有相同名字的一個應用程序,選擇包含想要轉換的目錄,並在向導的Virtual Directory Alias頁中使用該目錄名。例如把已有的test目錄轉換為一個虛擬應用程序,應該在Internet Services Manager中選擇Default Web Site條目,並提供一個別名“test”。
再單擊Next,指定包含該應用程序的內容(頁面)的路徑。單擊Browser選擇一個已有目錄。這個目錄是新的虛擬應用指向的目錄。屏幕如圖3-5所示:

圖3-5 指定路徑時的屏幕
單擊Next打開Access Permissions頁,選擇給予這個應用程序的所有用戶的權限。缺省值是Read和Run Scripts,對大多數用戶而言是適合的。屏幕如圖3-6所示:

圖3-6 設置用戶許可權限時的屏幕
如果想編寫用戶可直接執行的、定制的編譯的CGI應用程序,只選擇“Execute”:例如,用戶通過在請求的URL中指定相應名字的方法執行的一個.exe文件,像“http://mysite.com/.../Test Application/create_user.exe?user=Jjones”。 
單擊Next,向導創建虛擬應用程序。在圖3-7所示的屏幕中,可在左邊的列表欄中看到帶有一個包含一些填充物的打開的小盒子圖標。

圖3-7 虛擬應用程序創建完成後的屏幕
如果現在用右鍵單擊新的應用程序並選擇PropertIEs,可以看到向導已經選擇的設置。在這裡可根據需要修改訪問權限、 “Local Path”和“Application Settings”。同時會看到一個Remove按鈕,可以用來刪除該虛擬應用程序,如圖3-8所示:

圖3-8 虛擬應用程序屬性設置的屏幕
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved