明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

管理會話(轉(zhuǎn)自IIS5.0文檔)

[摘要]管理會話成功開發(fā) Web 應(yīng)用程序的難題之一便是:當(dāng)用戶從應(yīng)用程序中的一頁轉(zhuǎn)到另一頁時,要維護整個訪問或“會話”期間的用戶信息。HTTP 是非狀態(tài)協(xié)議,也就是說 Web 服務(wù)器將每個網(wǎng)頁請求都當(dāng)作獨立的請求,服務(wù)器不保留以前請求的任何信息,即使它們只早于當(dāng)前請求幾秒鐘。這種無法記憶先前請求的缺陷使...

管理會話
成功開發(fā) Web 應(yīng)用程序的難題之一便是:當(dāng)用戶從應(yīng)用程序中的一頁轉(zhuǎn)到另一頁時,要維護整個訪問或“會話”期間的用戶信息。HTTP 是非狀態(tài)協(xié)議,也就是說 Web 服務(wù)器將每個網(wǎng)頁請求都當(dāng)作獨立的請求,服務(wù)器不保留以前請求的任何信息,即使它們只早于當(dāng)前請求幾秒鐘。這種無法記憶先前請求的缺陷使得編寫應(yīng)用程序很困難,比如編寫聯(lián)機目錄,應(yīng)用程序可能要跟蹤當(dāng)用戶在目錄中不同頁間跳轉(zhuǎn)時所選的目錄項目。
ASP 為管理會話信息問題提供了獨特的解決方案。使用 ASP Session 對象和服務(wù)器生成的特定用戶 ID,可以創(chuàng)建更聰明的應(yīng)用程序,以便標(biāo)識每次訪問的用戶并收集信息,應(yīng)用程序隨后就可以利用這些信息來跟蹤用戶喜好或選擇。
要點 ASP 通過 HTTP cookie 指派用戶 ID,cookie 是存儲在用戶瀏覽器中的小文件。因此,如果正在為不支持 cookie 的瀏覽器創(chuàng)建應(yīng)用程序,或者如果用戶瀏覽器設(shè)置為拒絕 cookie,則不要使用 ASP 的會話管理功能。 啟動和結(jié)束會話
會話有四種開始方式: 新用戶請求的 URL 標(biāo)識應(yīng)用程序中的 .asp 文件,并且該應(yīng)用程序的 Global.asa 文件包含 Session_OnStart 過程。 用戶保留有“Session”對象中的值。 只要服務(wù)器收到的請求中不包含有效的 SessionID cookie,就將自動啟動新會話。 用戶請求應(yīng)用程序中的 .asp 文件,并且應(yīng)用程序的 Global.asa 文件使用 <OBJECT> 標(biāo)記在會話間實例化對象。關(guān)于使用<OBJECT> 標(biāo)記來創(chuàng)建對象實例的詳細(xì)信息,請參閱使用組件和對象。
如果用戶在指定時間間隔內(nèi)沒有請求或刷新應(yīng)用程序中的網(wǎng)頁,會話將自動結(jié)束。默認(rèn)情況下該值為 20 分鐘?梢酝ㄟ^設(shè)置 Internet 信息服務(wù)管理單元“應(yīng)用程序選項”屬性頁中的會話超時。 該值的設(shè)置取決于 Web 應(yīng)用程序的要求以及服務(wù)器的內(nèi)存容量。例如,如果希望瀏覽 Web 應(yīng)用程序的用戶在每頁上只停留幾分鐘,則可以使會話超時值遠(yuǎn)低于默認(rèn)值。會話超時過長可能導(dǎo)致打開的會話太多,這將增加服務(wù)器內(nèi)存資源的負(fù)擔(dān)。
對于特定會話,如果要設(shè)置低于默認(rèn)應(yīng)用程序超時的超時間隔,也可以設(shè)置“Session”對象的“Timeout”屬性。例如,下面腳本設(shè)置的超時間隔為 5 分鐘。<%  Session.Timeout = 5  %>
也可以使超時間隔大于默認(rèn)值,該值由“會話超時”屬性決定。
注意“Timeout”只適用于具有狀態(tài)的會話。在“無狀態(tài)會話”期間,“Session”對象不包含內(nèi)容或靜態(tài)對象。此類會話在請求處理完畢后自動結(jié)束,并當(dāng)收到同一瀏覽器的下一個請求時重新創(chuàng)建。

另外,如確實希望結(jié)束會話,可以使用“Session”對象的 Abandon 方法。例如,可以在窗體中提供“退出”按鈕,在該窗體中對包含下列命令的 .asp 文件 URL 設(shè)置 ACTION 參數(shù)。<% Session.Abandon %>
注意 如果排隊等待執(zhí)行的用戶請求優(yōu)先于初始化 Session.Abandon,則這些請求將在所要放棄會話的環(huán)境中執(zhí)行。當(dāng) Session.Abandon 執(zhí)行完畢后,新收到的請求不與該會話相關(guān)聯(lián)。 關(guān)于 SessionID 和 Cookies
用戶第一次請求特定應(yīng)用程序內(nèi)的 .asp 文件時,ASP 將生成一個“SessionID”。這是通過復(fù)雜算法產(chǎn)生的數(shù)值,SessionID 唯一標(biāo)識每個用戶的會話。新會話開始時,服務(wù)器將 Session ID 作為 cookie 存儲到用戶 Web 瀏覽器中。
SessionID cookie 類似于小櫥柜鑰匙,當(dāng)用戶在會話期間與應(yīng)用程序交互時,ASP 可以將用戶信息儲存到服務(wù)器上的“小櫥柜”內(nèi)。用戶 SessionID cookie(在 HTTP 請求頭文件內(nèi)傳送)同意以小櫥柜鑰匙允許訪問小櫥柜內(nèi)容的方式訪問該。ASP 每次收到網(wǎng)頁請求時,都檢查 HTTP 請求頭文件內(nèi)的 SessionID cookie。
將 SessionID cookie 存儲到用戶瀏覽器后,即使用戶請求其他 .asp 文件或請求在其他應(yīng)用程序中運行的 .asp 文件,ASP 也會重復(fù)使用同一 cookie 來跟蹤會話。同樣,如果用戶主動放棄會話或放任會話超時,然后繼續(xù)請求其他 .asp 文件,ASP 仍舊使用同一 cookie 開始新會話。用戶收到新 SessionID cookie 的唯一機會就是,服務(wù)器管理員重新啟動服務(wù)器從而清除存儲在內(nèi)存中的 SessionID 設(shè)置,或者用戶重新啟動 Web 瀏覽器。
通過重復(fù)使用 SessionID cookie,ASP 將發(fā)送到瀏覽器的 cookie 數(shù)量減到最少。另外,如果確定 ASP 應(yīng)用程序不需要會話管理,則可以禁止 ASP 跟蹤會話和向用戶發(fā)送 SessionID cookie。
在下列情況下,ASP 將不會發(fā)送會話 cookie: 應(yīng)用程序禁用會話狀態(tài)。 ASP 頁定義為無會話,即包含<%@ EnableSessionState=False %>標(biāo)記的頁。詳細(xì)信息,請參閱無會話 ASP 頁。
還應(yīng)注意 SessionID cookie 并不是跟蹤用戶對 Web 站點進行多次訪問的永久途徑。SessionID 信息存儲在服務(wù)器計算機內(nèi)存中,很容易丟失。如果要在很長時間間隔內(nèi)跟蹤訪問 Web 應(yīng)用程序的用戶,必須創(chuàng)建用戶標(biāo)識,方法是將特定 cookie 存儲到用戶 Web 瀏覽器并將 cookie 信息保存到數(shù)據(jù)庫。詳細(xì)信息,請參閱使用 Cookie。 存儲和刪除“Session”對象中的數(shù)據(jù)
“Session”對象提供動態(tài)關(guān)聯(lián)數(shù)組,可以在數(shù)組中存儲信息?梢栽凇癝ession”對象中存儲單純變量和對象變量。
要在“Session”對象中存儲變量,需指定“Session”對象中已命名條目的值。例如,下面的命令將兩個新變量存儲到“Session”對象:<%Session("FirstName") = "Jeff"Session("LastName") = "Smith"%>
要從”Session”對象中檢索信息,訪問已命名的條目即可。例如,要顯示 Session("FirstName") 的當(dāng)前值:歡迎<%= Session("FirstName") %>
可以將用戶首選項存儲到”Session”對象中,然后訪問這些首選項以便確定返回給用戶的頁面。例如,可以允許用戶在應(yīng)用程序首頁中指定只查看純文本內(nèi)容,然后將此項選擇應(yīng)用于用戶在該應(yīng)用程序中訪問的所有后續(xù)頁。<% If Session("ScreenResolution") = "Low" Then %>這是文字頁面。<% Else %>這是多媒體頁面。<% End If %>
也可以在”Session”對象中存儲對象例程,雖然這樣做可能影響服務(wù)器性能。詳細(xì)信息,請參閱設(shè)置對象作用域。
有時,可能希望刪除”Session”對象中存儲的項目。例如,對于訪問網(wǎng)上零售店的用戶來說,改變主意、放棄一系列采購項目并作出全新的選擇是不常見的。在這種情況下,刪除不適宜的值并更新”Session”對象將會非常有用。
“Session”對象的 Contents 集合包含已存儲的所有會話變量(即那些沒有使用 HTML 的 <OBJECT> 標(biāo)記存儲的變量)。通過使用“Contents”集合中的 Remove 方法,可以有選擇地刪除為會話狀態(tài)添加的變量引用。下面腳本說明如何使用“Remove”方法來清除”Session”對象中的項目(這里為用戶折扣信息):<%If Session.Contents("Purchamnt") <= 75 thenSession.Contents.Remove("Discount")End If%>
如果需要,也可以使用“Contents”集合的 RemoveAll 方法完全刪除已存儲的所有會話變量:Session.Content.RemoveAll()使用“Remove”方法時可以按照名稱或索引來刪除項目。下列腳本說明如何循環(huán)查看”Session”對象中存儲的值并按照索引有條件地刪除項目: <%For Each intQuote in Session.ContentsIf Session.Contents(intQuote) < 200 ThenSession.Contents.Remove(intQuote)End IfNext%>管理多服務(wù)器的會話
ASP 會話信息存儲于 Web 服務(wù)器。瀏覽器必須請求同一 Web 服務(wù)器的網(wǎng)頁以便腳本訪問會話信息。在 Web 服務(wù)器群集(由許多 Web 服務(wù)器共同響應(yīng)用戶請求)中,用戶請求不會總是路由到同一服務(wù)器。相反,專用軟件將對站點 URL 的請求分發(fā)到任一空閑的服務(wù)器,該進程稱為“平衡加載”。平衡加載使得維護 Web 服務(wù)器群集上的會話信息十分困難。
要在平衡加載的站點上使用 ASP 會話管理,必須確保用戶會話中的所有請求都發(fā)送到同一 Web 服務(wù)器。一種方法是編寫 Session_OnStart 過程,該過程通過“Response”對象將瀏覽器重定向到運行用戶會話的特定 Web 服務(wù)器。如果應(yīng)用程序頁中的鏈接都是相對鏈接,則未來請求都將路由到同一服務(wù)器。
例如,用戶訪問應(yīng)用程序時可能請求站點的一般 URL:http://www.microsoft.com.加載平衡程序?qū)⒄埱舐酚傻街付ǚ⻊?wù)器,如 server3.microsoft.com。ASP 在該服務(wù)器上創(chuàng)建新會話。在“Session_OnStart”過程中,瀏覽器將重定向到指定的服務(wù)器:<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
瀏覽器將請求指定頁,只要原始 URL 中沒有引用指定的服務(wù)器名稱,所有后續(xù)請求都將路由到同一服務(wù)器。 使用 Cookie
cookie 是一種標(biāo)記,由 Web 服務(wù)器嵌入用戶瀏覽器中以便標(biāo)識用戶。下次同一瀏覽器請求網(wǎng)頁時,將發(fā)送從 Web 服務(wù)器收到的 cookie。Cookie 允許一組信息與用戶相關(guān)聯(lián)。通過使用“Response”和“Request”對象中的 Cookies 集合,ASP 腳本可以獲取和設(shè)置 cookie 值。 設(shè)置 Cookie
要設(shè)置 cookie 值,可使用“Response.Cookies”。如果 cookie 尚未存在,“Response.Cookies”將新建一個。例如,要將關(guān)聯(lián)值為 ("49") 的 cookie ("VisitorID") 發(fā)送到瀏覽器,可使用下面的命令,該命令必須位于 Web 頁中的 <HTML> 標(biāo)記之前:<% Response.Cookies("VisitorID") = 49 %>
如果只希望在當(dāng)前用戶會話中使用 cookie,則將 cookie 發(fā)送到瀏覽器即可。但是,如果在用戶已經(jīng)停止并重新啟動瀏覽器后仍需要標(biāo)識用戶,則必須強制瀏覽器在客戶端計算機硬盤文件中存儲 cookie。要保存 cookie,可使用“Response.Cookies”的“Expires”屬性,并設(shè)置為將來的某個日期:<%Response.Cookies("VisitorID") = 49Response.Cookies("VisitorID").Expires = "December 31, 2001"%>
cookie 可以有多個值;這樣的 cookie 稱為“索引 cookie”。索引 cookie 值是分配的鍵值;可以設(shè)置特定的 cookie 鍵值。例如:<% Response.Cookies("VisitorID")("49") = "Travel" %>
如果現(xiàn)有的 cookie 具有鍵值,但“Response.Cookies”沒有指定鍵名,則將刪除現(xiàn)有鍵值。同樣,如果現(xiàn)有的 cookie 沒有鍵值,但“Response.Cookies”指定了鍵名和鍵值,則刪除現(xiàn)有的 cookie 值并創(chuàng)建新鍵值對。 獲取 Cookies
要獲取 cookie 值,可使用“Request.Cookies”集合。例如,如果用戶 HTTP 請求設(shè)置了“VisitorID=49”,則下面的語句將檢索值“49”:<%= Request.Cookies("VisitorID") %>
類似地,可通過鍵名來檢索索引 cookie 的鍵值。例如,如果用戶瀏覽器在 HTTP 請求頭文件中發(fā)送下列信息:Cookie:VisitorID=49=Travel
下列語句將返回值 Travel:<%= Request.Cookies("VisitorID")("49") %>設(shè)置 Cookie 路徑
ASP 在 Web 瀏覽器上存儲的每個 cookie 都包含路徑信息。當(dāng)瀏覽器請求的文件的保存位置與 cookie 中指定的路徑相同時,則瀏覽器自動將 cookie 傳送給服務(wù)器。默認(rèn)情況下,cookie 路徑對應(yīng)于應(yīng)用程序的名稱,該應(yīng)用程序包含最初生成cookie 的 .asp 文件。例如,如果駐留在應(yīng)用程序“UserApplication”中的 .asp 文件生成 cookie,則用戶 Web 瀏覽器每次檢索駐留在該應(yīng)用程序中的任何文件時,都將傳送該 cookie 以及包含路徑“/UserApplication”的其他所有 cookie。
要指定 cookie 的路徑(不是默認(rèn)的應(yīng)用程序路徑),可以使用 ASP“Response.Cookies”集合的“Path”屬性。例如,下面的腳本將路徑“SalesApp/Customer/Profiles/”指定給 cookie“Purchases”:<%Response.Cookies("Purchases") = "12"Response.Cookies("Purchases").Expires = "January 1, 2001"Response.Cookies("Purchases").Path = "/SalesApp/Customer/Profiles/"%>
無論何時,只要包含“Purchases”cookie 的 Web 瀏覽器請求駐留于路徑“/SalesApp/Customer/Profiles/”或其子目錄中的文件,瀏覽器都將 cookie 傳送到服務(wù)器。
許多 Web 瀏覽器,包括 Microsoft Internet Explorer 4.0 或更新版本以及 Netscape 瀏覽器,都保留 cookie 路徑的大小寫。這意味著,如果請求的文件路徑與存儲的 cookie 路徑大小寫不一致,則瀏覽器不會將 cookie 發(fā)送到服務(wù)器。例如,對 ASP 來說,虛擬目錄 /TRAVEL 和 /travel 是相同的 ASP 應(yīng)用程序;但對保留 URL 大小寫的瀏覽器來說,/TRAVEL 和 /travel 是兩個不同的應(yīng)用程序。確認(rèn)所有 .asp 文件的 URL 都具有相同的大小寫以便確保用戶瀏覽器傳送已存儲的 cookie。
可以使用下面的語句來設(shè)置 cookie 路徑,這樣無論何時,只要瀏覽器請求服務(wù)器中的文件,用戶 Web 瀏覽器都將傳送 cookie,而不考慮應(yīng)用程序或路徑:Response.Cookies("Purchases").Path = "/"
不過要注意,如果將 cookie 傳送到服務(wù)器但不區(qū)分應(yīng)用程序,并且 cookie 包含不應(yīng)從特定應(yīng)用程序外部訪問的敏感信息時,可能導(dǎo)致潛在的安全問題。 保留狀態(tài)(無 Cookies)
并非所有瀏覽器都支持 cookie。即使對于支持 cookie 的瀏覽器,某些用戶也可以關(guān)閉 cookie 支持。如果應(yīng)用程序需要響應(yīng)不支持 cookies 瀏覽器,則不能使用 ASP 會話管理。
這種情況下,必須編寫自己的機制以便在應(yīng)用程序的頁之間傳遞信息。有兩種常用方法可以用于此目的: 在 URL 查詢字符串中添加參數(shù)。例如: http://MyServer/MyApp/start.asp?name=Jeff
不過對于某些瀏覽器,如果通過 GET 方法提交窗體,則可能丟棄查詢字符串傳遞的任何顯式參數(shù)。 在窗體中添加隱藏值。例如,下面的 HTML 窗體包含隱藏控件,該控件不會顯示在實際窗體中,并且在用戶 Web 瀏覽器中不可見。該窗體通過 HTTP POST 方法傳遞用戶標(biāo)識值以及用戶提供的信息。 <FORM METHOD="POST" ACTION="/scripts/inform.asp"><INPUT TYPE="text" NAME="city" VALUE=""><INPUT TYPE="text" NAME="country" VALUE =""><INPUT TYPE="hidden" NAME="userid" VALUE= <%= UserIDNum(i) %><INPUT TYPE="submit"  VALUE="Enter">
該方法要求將所有傳遞用戶信息的鏈接目標(biāo)都編碼為 HTML 窗體。
如果不使用 ASP 會話管理,則應(yīng)關(guān)閉對應(yīng)用程序的會話支持。啟用會話時,ASP 將向請求網(wǎng)頁的所有瀏覽器發(fā)送 SessionID cookie。要關(guān)閉會話支持,可清除 Internet 信息服務(wù)管理單元“應(yīng)用程序選項”屬性頁上的“啟用會話狀態(tài)”復(fù)選框。 無會話 ASP 頁
通過 ASP,也可以創(chuàng)建無會話頁,該頁可用來推遲創(chuàng)建會話跟蹤,直到需要時為止。
無會話頁將“不”執(zhí)行下列任務(wù): 執(zhí)行“Session_OnStart”過程。 發(fā)送 session ID cookie。 創(chuàng)建”Session”對象。 訪問由 <OBJECT> 標(biāo)記創(chuàng)建的嵌入式”Session”對象或會話范圍對象。 (與其他會話請求一起)系列化執(zhí)行。
要配置無會話的 .asp 文件,可使用:<%@ EnableSessionState=False %>
應(yīng)將該腳本置于 .asp 文件第一行,在其他任何腳本之前。默認(rèn)情況下,如果省略該標(biāo)記,則啟用會話跟蹤。
無會話 ASP 頁可消除潛在的耗時會話活動,從而增強服務(wù)器的應(yīng)答能力。例如,對于包含兩個 HTML 框架的 ASP 頁:frames 1 和 2,它們都位于同一頁面組。Frame 1 包含用來執(zhí)行復(fù)雜腳本的 .asp 文件,而 frame 2 包含簡單的 .asp 文件。因為 ASP 按先后順序或“系列化”執(zhí)行會話請求,所以無法在 frame 1 中的腳本執(zhí)行完畢之前查看 frame 2 的內(nèi)容。然而,如果將 frame 1 中的 .asp 文件設(shè)置為無會話,則 ASP 請求不再系列化,瀏覽器將在 frame 1 內(nèi)容執(zhí)行完畢前處理 frame 2 的內(nèi)容。
不過,如何處理對不同框架的多個請求完全取決于用戶 Web 瀏覽器的配置。某些 Web 瀏覽器可能系列化請求,而忽略 .asp 文件的無會話配置。