管理會話(轉自IIS5.0文檔)
發表時間:2024-01-21 來源:明輝站整理相關軟件相關文章人氣:
[摘要]管理會話成功開發 Web 應用程序的難題之一便是:當用戶從應用程序中的一頁轉到另一頁時,要維護整個訪問或“會話”期間的用戶信息。HTTP 是非狀態協議,也就是說 Web 服務器將每個網頁請求都當作獨立的請求,服務器不保留以前請求的任何信息,即使它們只早于當前請求幾秒鐘。這種無法記憶先前請求的缺陷使...
管理會話
成功開發 Web 應用程序的難題之一便是:當用戶從應用程序中的一頁轉到另一頁時,要維護整個訪問或“會話”期間的用戶信息。HTTP 是非狀態協議,也就是說 Web 服務器將每個網頁請求都當作獨立的請求,服務器不保留以前請求的任何信息,即使它們只早于當前請求幾秒鐘。這種無法記憶先前請求的缺陷使得編寫應用程序很困難,比如編寫聯機目錄,應用程序可能要跟蹤當用戶在目錄中不同頁間跳轉時所選的目錄項目。
ASP 為管理會話信息問題提供了獨特的解決方案。使用 ASP Session 對象和服務器生成的特定用戶 ID,可以創建更聰明的應用程序,以便標識每次訪問的用戶并收集信息,應用程序隨后就可以利用這些信息來跟蹤用戶喜好或選擇。
要點 ASP 通過 HTTP cookie 指派用戶 ID,cookie 是存儲在用戶瀏覽器中的小文件。因此,如果正在為不支持 cookie 的瀏覽器創建應用程序,或者如果用戶瀏覽器設置為拒絕 cookie,則不要使用 ASP 的會話管理功能。 啟動和結束會話
會話有四種開始方式: 新用戶請求的 URL 標識應用程序中的 .asp 文件,并且該應用程序的 Global.asa 文件包含 Session_OnStart 過程。 用戶保留有“Session”對象中的值。 只要服務器收到的請求中不包含有效的 SessionID cookie,就將自動啟動新會話。 用戶請求應用程序中的 .asp 文件,并且應用程序的 Global.asa 文件使用 <OBJECT> 標記在會話間實例化對象。關于使用<OBJECT> 標記來創建對象實例的詳細信息,請參閱使用組件和對象。
如果用戶在指定時間間隔內沒有請求或刷新應用程序中的網頁,會話將自動結束。默認情況下該值為 20 分鐘。可以通過設置 Internet 信息服務管理單元“應用程序選項”屬性頁中的會話超時。 該值的設置取決于 Web 應用程序的要求以及服務器的內存容量。例如,如果希望瀏覽 Web 應用程序的用戶在每頁上只停留幾分鐘,則可以使會話超時值遠低于默認值。會話超時過長可能導致打開的會話太多,這將增加服務器內存資源的負擔。
對于特定會話,如果要設置低于默認應用程序超時的超時間隔,也可以設置“Session”對象的“Timeout”屬性。例如,下面腳本設置的超時間隔為 5 分鐘。<% Session.Timeout = 5 %>
也可以使超時間隔大于默認值,該值由“會話超時”屬性決定。
注意“Timeout”只適用于具有狀態的會話。在“無狀態會話”期間,“Session”對象不包含內容或靜態對象。此類會話在請求處理完畢后自動結束,并當收到同一瀏覽器的下一個請求時重新創建。
另外,如確實希望結束會話,可以使用“Session”對象的 Abandon 方法。例如,可以在窗體中提供“退出”按鈕,在該窗體中對包含下列命令的 .asp 文件 URL 設置 ACTION 參數。<% Session.Abandon %>
注意 如果排隊等待執行的用戶請求優先于初始化 Session.Abandon,則這些請求將在所要放棄會話的環境中執行。當 Session.Abandon 執行完畢后,新收到的請求不與該會話相關聯。 關于 SessionID 和 Cookies
用戶第一次請求特定應用程序內的 .asp 文件時,ASP 將生成一個“SessionID”。這是通過復雜算法產生的數值,SessionID 唯一標識每個用戶的會話。新會話開始時,服務器將 Session ID 作為 cookie 存儲到用戶 Web 瀏覽器中。
SessionID cookie 類似于小櫥柜鑰匙,當用戶在會話期間與應用程序交互時,ASP 可以將用戶信息儲存到服務器上的“小櫥柜”內。用戶 SessionID cookie(在 HTTP 請求頭文件內傳送)同意以小櫥柜鑰匙允許訪問小櫥柜內容的方式訪問該。ASP 每次收到網頁請求時,都檢查 HTTP 請求頭文件內的 SessionID cookie。
將 SessionID cookie 存儲到用戶瀏覽器后,即使用戶請求其他 .asp 文件或請求在其他應用程序中運行的 .asp 文件,ASP 也會重復使用同一 cookie 來跟蹤會話。同樣,如果用戶主動放棄會話或放任會話超時,然后繼續請求其他 .asp 文件,ASP 仍舊使用同一 cookie 開始新會話。用戶收到新 SessionID cookie 的唯一機會就是,服務器管理員重新啟動服務器從而清除存儲在內存中的 SessionID 設置,或者用戶重新啟動 Web 瀏覽器。
通過重復使用 SessionID cookie,ASP 將發送到瀏覽器的 cookie 數量減到最少。另外,如果確定 ASP 應用程序不需要會話管理,則可以禁止 ASP 跟蹤會話和向用戶發送 SessionID cookie。
在下列情況下,ASP 將不會發送會話 cookie: 應用程序禁用會話狀態。 ASP 頁定義為無會話,即包含<%@ EnableSessionState=False %>標記的頁。詳細信息,請參閱無會話 ASP 頁。
還應注意 SessionID cookie 并不是跟蹤用戶對 Web 站點進行多次訪問的永久途徑。SessionID 信息存儲在服務器計算機內存中,很容易丟失。如果要在很長時間間隔內跟蹤訪問 Web 應用程序的用戶,必須創建用戶標識,方法是將特定 cookie 存儲到用戶 Web 瀏覽器并將 cookie 信息保存到數據庫。詳細信息,請參閱使用 Cookie。 存儲和刪除“Session”對象中的數據
“Session”對象提供動態關聯數組,可以在數組中存儲信息。可以在“Session”對象中存儲單純變量和對象變量。
要在“Session”對象中存儲變量,需指定“Session”對象中已命名條目的值。例如,下面的命令將兩個新變量存儲到“Session”對象:<%Session("FirstName") = "Jeff"Session("LastName") = "Smith"%>
要從”Session”對象中檢索信息,訪問已命名的條目即可。例如,要顯示 Session("FirstName") 的當前值:歡迎<%= Session("FirstName") %>
可以將用戶首選項存儲到”Session”對象中,然后訪問這些首選項以便確定返回給用戶的頁面。例如,可以允許用戶在應用程序首頁中指定只查看純文本內容,然后將此項選擇應用于用戶在該應用程序中訪問的所有后續頁。<% If Session("ScreenResolution") = "Low" Then %>這是文字頁面。<% Else %>這是多媒體頁面。<% End If %>
也可以在”Session”對象中存儲對象例程,雖然這樣做可能影響服務器性能。詳細信息,請參閱設置對象作用域。
有時,可能希望刪除”Session”對象中存儲的項目。例如,對于訪問網上零售店的用戶來說,改變主意、放棄一系列采購項目并作出全新的選擇是不常見的。在這種情況下,刪除不適宜的值并更新”Session”對象將會非常有用。
“Session”對象的 Contents 集合包含已存儲的所有會話變量(即那些沒有使用 HTML 的 <OBJECT> 標記存儲的變量)。通過使用“Contents”集合中的 Remove 方法,可以有選擇地刪除為會話狀態添加的變量引用。下面腳本說明如何使用“Remove”方法來清除”Session”對象中的項目(這里為用戶折扣信息):<%If Session.Contents("Purchamnt") <= 75 thenSession.Contents.Remove("Discount")End If%>
如果需要,也可以使用“Contents”集合的 RemoveAll 方法完全刪除已存儲的所有會話變量:Session.Content.RemoveAll()使用“Remove”方法時可以按照名稱或索引來刪除項目。下列腳本說明如何循環查看”Session”對象中存儲的值并按照索引有條件地刪除項目: <%For Each intQuote in Session.ContentsIf Session.Contents(intQuote) < 200 ThenSession.Contents.Remove(intQuote)End IfNext%>管理多服務器的會話
ASP 會話信息存儲于 Web 服務器。瀏覽器必須請求同一 Web 服務器的網頁以便腳本訪問會話信息。在 Web 服務器群集(由許多 Web 服務器共同響應用戶請求)中,用戶請求不會總是路由到同一服務器。相反,專用軟件將對站點 URL 的請求分發到任一空閑的服務器,該進程稱為“平衡加載”。平衡加載使得維護 Web 服務器群集上的會話信息十分困難。
要在平衡加載的站點上使用 ASP 會話管理,必須確保用戶會話中的所有請求都發送到同一 Web 服務器。一種方法是編寫 Session_OnStart 過程,該過程通過“Response”對象將瀏覽器重定向到運行用戶會話的特定 Web 服務器。如果應用程序頁中的鏈接都是相對鏈接,則未來請求都將路由到同一服務器。
例如,用戶訪問應用程序時可能請求站點的一般 URL:http://www.microsoft.com.加載平衡程序將請求路由到指定服務器,如 server3.microsoft.com。ASP 在該服務器上創建新會話。在“Session_OnStart”過程中,瀏覽器將重定向到指定的服務器:<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
瀏覽器將請求指定頁,只要原始 URL 中沒有引用指定的服務器名稱,所有后續請求都將路由到同一服務器。 使用 Cookie
cookie 是一種標記,由 Web 服務器嵌入用戶瀏覽器中以便標識用戶。下次同一瀏覽器請求網頁時,將發送從 Web 服務器收到的 cookie。Cookie 允許一組信息與用戶相關聯。通過使用“Response”和“Request”對象中的 Cookies 集合,ASP 腳本可以獲取和設置 cookie 值。 設置 Cookie
要設置 cookie 值,可使用“Response.Cookies”。如果 cookie 尚未存在,“Response.Cookies”將新建一個。例如,要將關聯值為 ("49") 的 cookie ("VisitorID") 發送到瀏覽器,可使用下面的命令,該命令必須位于 Web 頁中的 <HTML> 標記之前:<% Response.Cookies("VisitorID") = 49 %>
如果只希望在當前用戶會話中使用 cookie,則將 cookie 發送到瀏覽器即可。但是,如果在用戶已經停止并重新啟動瀏覽器后仍需要標識用戶,則必須強制瀏覽器在客戶端計算機硬盤文件中存儲 cookie。要保存 cookie,可使用“Response.Cookies”的“Expires”屬性,并設置為將來的某個日期:<%Response.Cookies("VisitorID") = 49Response.Cookies("VisitorID").Expires = "December 31, 2001"%>
cookie 可以有多個值;這樣的 cookie 稱為“索引 cookie”。索引 cookie 值是分配的鍵值;可以設置特定的 cookie 鍵值。例如:<% Response.Cookies("VisitorID")("49") = "Travel" %>
如果現有的 cookie 具有鍵值,但“Response.Cookies”沒有指定鍵名,則將刪除現有鍵值。同樣,如果現有的 cookie 沒有鍵值,但“Response.Cookies”指定了鍵名和鍵值,則刪除現有的 cookie 值并創建新鍵值對。 獲取 Cookies
要獲取 cookie 值,可使用“Request.Cookies”集合。例如,如果用戶 HTTP 請求設置了“VisitorID=49”,則下面的語句將檢索值“49”:<%= Request.Cookies("VisitorID") %>
類似地,可通過鍵名來檢索索引 cookie 的鍵值。例如,如果用戶瀏覽器在 HTTP 請求頭文件中發送下列信息:Cookie:VisitorID=49=Travel
下列語句將返回值 Travel:<%= Request.Cookies("VisitorID")("49") %>設置 Cookie 路徑
ASP 在 Web 瀏覽器上存儲的每個 cookie 都包含路徑信息。當瀏覽器請求的文件的保存位置與 cookie 中指定的路徑相同時,則瀏覽器自動將 cookie 傳送給服務器。默認情況下,cookie 路徑對應于應用程序的名稱,該應用程序包含最初生成cookie 的 .asp 文件。例如,如果駐留在應用程序“UserApplication”中的 .asp 文件生成 cookie,則用戶 Web 瀏覽器每次檢索駐留在該應用程序中的任何文件時,都將傳送該 cookie 以及包含路徑“/UserApplication”的其他所有 cookie。
要指定 cookie 的路徑(不是默認的應用程序路徑),可以使用 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 傳送到服務器。
許多 Web 瀏覽器,包括 Microsoft Internet Explorer 4.0 或更新版本以及 Netscape 瀏覽器,都保留 cookie 路徑的大小寫。這意味著,如果請求的文件路徑與存儲的 cookie 路徑大小寫不一致,則瀏覽器不會將 cookie 發送到服務器。例如,對 ASP 來說,虛擬目錄 /TRAVEL 和 /travel 是相同的 ASP 應用程序;但對保留 URL 大小寫的瀏覽器來說,/TRAVEL 和 /travel 是兩個不同的應用程序。確認所有 .asp 文件的 URL 都具有相同的大小寫以便確保用戶瀏覽器傳送已存儲的 cookie。
可以使用下面的語句來設置 cookie 路徑,這樣無論何時,只要瀏覽器請求服務器中的文件,用戶 Web 瀏覽器都將傳送 cookie,而不考慮應用程序或路徑:Response.Cookies("Purchases").Path = "/"
不過要注意,如果將 cookie 傳送到服務器但不區分應用程序,并且 cookie 包含不應從特定應用程序外部訪問的敏感信息時,可能導致潛在的安全問題。 保留狀態(無 Cookies)
并非所有瀏覽器都支持 cookie。即使對于支持 cookie 的瀏覽器,某些用戶也可以關閉 cookie 支持。如果應用程序需要響應不支持 cookies 瀏覽器,則不能使用 ASP 會話管理。
這種情況下,必須編寫自己的機制以便在應用程序的頁之間傳遞信息。有兩種常用方法可以用于此目的: 在 URL 查詢字符串中添加參數。例如: http://MyServer/MyApp/start.asp?name=Jeff
不過對于某些瀏覽器,如果通過 GET 方法提交窗體,則可能丟棄查詢字符串傳遞的任何顯式參數。 在窗體中添加隱藏值。例如,下面的 HTML 窗體包含隱藏控件,該控件不會顯示在實際窗體中,并且在用戶 Web 瀏覽器中不可見。該窗體通過 HTTP POST 方法傳遞用戶標識值以及用戶提供的信息。 <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">
該方法要求將所有傳遞用戶信息的鏈接目標都編碼為 HTML 窗體。
如果不使用 ASP 會話管理,則應關閉對應用程序的會話支持。啟用會話時,ASP 將向請求網頁的所有瀏覽器發送 SessionID cookie。要關閉會話支持,可清除 Internet 信息服務管理單元“應用程序選項”屬性頁上的“啟用會話狀態”復選框。 無會話 ASP 頁
通過 ASP,也可以創建無會話頁,該頁可用來推遲創建會話跟蹤,直到需要時為止。
無會話頁將“不”執行下列任務: 執行“Session_OnStart”過程。 發送 session ID cookie。 創建”Session”對象。 訪問由 <OBJECT> 標記創建的嵌入式”Session”對象或會話范圍對象。 (與其他會話請求一起)系列化執行。
要配置無會話的 .asp 文件,可使用:<%@ EnableSessionState=False %>
應將該腳本置于 .asp 文件第一行,在其他任何腳本之前。默認情況下,如果省略該標記,則啟用會話跟蹤。
無會話 ASP 頁可消除潛在的耗時會話活動,從而增強服務器的應答能力。例如,對于包含兩個 HTML 框架的 ASP 頁:frames 1 和 2,它們都位于同一頁面組。Frame 1 包含用來執行復雜腳本的 .asp 文件,而 frame 2 包含簡單的 .asp 文件。因為 ASP 按先后順序或“系列化”執行會話請求,所以無法在 frame 1 中的腳本執行完畢之前查看 frame 2 的內容。然而,如果將 frame 1 中的 .asp 文件設置為無會話,則 ASP 請求不再系列化,瀏覽器將在 frame 1 內容執行完畢前處理 frame 2 的內容。
不過,如何處理對不同框架的多個請求完全取決于用戶 Web 瀏覽器的配置。某些 Web 瀏覽器可能系列化請求,而忽略 .asp 文件的無會話配置。