今天上班同事問我,什麼是會話ID?怎麼使用會話ID?我看了看他的問題,是關於網址裡面不能使用會話ID,可能被降權或者被K,我當時的感覺就是可能是與COOKIE有關的東西,但是不敢確定,於是在網上找了找資料,大家看看下面能不能看明白呢?
HTTP是一種無狀態協議。當客戶機向服務器發送一個請求時,服務器並不知道這是客戶機的第1個還是第42個請求。這對ASP開發來說無異帶來了比較嚴重的問題,因為經常有必要給特定的客戶機關聯服務器方變量。比方說,網站在向我發送我訂購的Jethro Tull CD同時向其他人發送Barry Manilow CD就是因為這一關聯的重要作用。ASP通過稱為會話ID的唯一的客戶標識符處理這種關聯關系,當客戶在開始他或她的浏覽器會話時就會被分配這種會話ID。
現在讓我們看看傳統的ASP和現代的ASP.NET圍繞會話ID的使用而存在的一些問題。然後,我們討論下運行多個Web服務器時的會話問題。
什麼是會話ID
會話ID是一種唯一標識當前訪問服務器的客戶的只讀值。在經典的ASP環境下,會話ID是按照順序方式被分配的,也就是說,會話ID 706616433之後跟著會話 ID 706616434等等。傳統的ASP會話ID以加密的、非持久存在的cookie形式保存在客戶機上。例如,會話ID 706616434就可能作為cookie ASPSESSIONIDGQQGQGCS=JHMBOBKCBINEHLPKJHOPABBE保存在客戶機上。
ASP.NET下的會話ID有所變化。在使用 ASP.NET 時,會話ID是由URL合法ASCII字符組成的一個120位字符串。根據微軟文檔的說明,產生會話 ID 值采用了保證其唯一性的算法,從而避免出現兩個客戶試圖采用同一ID時出現的會話沖突。另外,會話ID的隨機性使得確定現有會話的ID變得非常困難從而帶來了額外的安全性。同傳統ASP一樣,ASP.NET的會話ID通常也作為非持久保存的cookie存儲在客戶機上。這種cookie的格式同傳統ASP相比稍有變化,例如,asp.net_sessionid=jhmbobkcbinehlpkjhopabbe。
除了維持狀態的傳統型的、非持久保存的cookie的方法之外,ASP.NET還支持一種不采用cookie的會話狀態維持模式。在啟用無cookie模式的情況下,ASP.NET在發送回客戶機的URL中嵌入會話ID。這樣就為使用不支持cookie或禁用cookie浏覽器的客戶提供了會話狀態堅持。考慮到利用cookie跟蹤客戶信息的舉動,我們有理由對無Cookie模式保持高度的關注。
如何使用會話ID
客戶每發出一個請求,包含加密會話ID的cookie在存在的情況下即被發送給服務器。服務器隨後確定cookie所關聯的會話ID並恢復關聯該客戶的所有會話變量。如果cookie不存在就會生成一個新的會話ID,同時加密的會話ID cookie則被發送給客戶機。這樣就能讓ASP跟蹤訪問網站的單個客戶了。同時,以上機制還促使ASP建立服務器方會話變量同單一會話的關聯關系。會話變量則被劃分為兩種類型:
內容集合
靜態對象(StaticObject)集合
ASP和ASP.NET下的內容集合(Contents Collection)會話變量都根據會話ID關聯特定的客戶。這些變量其實就是一個聯合數組,類似於Visual Basic的集合(Collection)對象。會話變量的原理完全一樣;唯一的本質差別是它們同一個特定會話相聯系。而集合對象則可以通過唯一鍵保存和檢索任何類型的數組成員。
靜態對象(StaticObject)集合包含了會話范圍內、用GLOBAL.ASA的<OBJECT>標簽添加到應用程序中所有對象。同內容集合一樣,StaticObject集合也是一個聯合數組,其訪問方式也相同。不過,StaticObject集合僅僅包含了用<OBJECT>實例化的對象而並不包含那些用Server.CreateObject方法實例化的對象。
一個客戶就只有一個會話ID嗎
對單一Web服務器而言,維護狀態在任何情況下都是自動的。客戶能得到而且只能得到唯一的一個會話ID,而且,只要網站上客戶保持在活動狀態,會話信息就會受到服務器的維持。然而,如果Web服務器超過一個,或者單獨的應用程序位於某一虛擬目錄下而該目錄又駐留在其他應用程序的虛擬目錄下時,維持狀態就變得更復雜了。
在分配會話ID時,每個服務器都是獨立進行操作的。因為這一緣故,Web服務器A就並不知道Web服務器B已經把會話ID 706616434分配給了某一客戶。因此,如果Web服務器A收到具有會話ID 706616434的客戶請求,這一請求會被當作會話超時進行處理,Web服務器A隨即分配一個新的會話ID。在發生這種情況時,客戶在Web服務器B上就失去了自己的狀態,而且在可能發生重復操作的情況下必須從頭開始。避免出現這一問題方法之一就是保證客戶的所有請求都被發送給了同一服務器。
在虛擬目錄下運行應用程序是實現同一Web服務器上隔離運行多個應用程序的方法之一。但是你得記住,當某一個應用程序調用另一應用程序時就會產生新的會話ID。這樣就會丟棄第1個會話 ID及其關聯存儲的所有會話變量。取決於應用程序的具體情況,狀態的丟失可能並不成為問題,但在調試會話時對此問題必須有足夠的認識。
小結
ASP足以應對創建持久的Web應用程序所面臨的最大挑戰——維護狀態。ASP的狀態維護機制令開發者無須創造自己專有的狀態維護機制就能開發出滿意的應用程序。使用ASP、事先周密計劃再加上努力的工作就可能創建出穩固的持久性應用程序。