2011-11-16 72 views
1

這是一個關於某些概念的基本問題。什麼,邏輯上和物理上是一個會話?

什麼是Web服務器(如IIS或Apache)環境中的會話定義。什麼是會話在物理上和邏輯上都是?

如何確定會話是開始已結束?使用服務器端計時器或什麼?

+0

Phew,我做了一些史詩般的編輯。這是否回答你的問題? –

回答

2

在網絡術語中,會話是用戶對網站的訪問,當用戶在網站周圍瀏覽時,可能會包含多個頁面視圖和交互。用戶做出的選擇和輸入的數據可以在會話期間保存並重新顯示或用於在會議期間相應地調整用戶體驗。關鍵是,Session代表用戶和站點之間的一組交互,而不是簡單的運行靜態頁面。會議預計只會持續很短的時間;如果用戶停止向該網站發出請求,幾分鐘後會話將被視爲結束。

HTTP是無狀態的,因此就瀏覽器和Web服務器之間的關係而言,會話不存在作爲物理實體。

邏輯上,,ASP.NET通過識別用戶對站點的循環調用並保存呼叫之間的會話狀態信息來模擬會話。

它通過在用戶第一次調用該網站時向cookie中的每個用戶分配唯一的令牌('會話ID')來實現這一點。隨後每當用戶撥打該網站時,他們都會呈現cookie。 ASP.NET識別它,並從持久性介質(ASP.NET將其存儲在服務器端,存儲器,狀態服務器或SQL數據庫中)中調用該令牌的任何持久會話數據。應用程序可以在HTTP請求的生命週期中讀取和修改會話數據,通常是響應用戶的操作。在請求結束時,會話數據將返回到持久性介質。

通過這種方式,保持了開放連續會話的幻覺。會話的開始很容易判斷 - 這是第一次爲用戶提供令牌,並將會話記錄存儲在具有時間戳的持久性介質中。關於會話何時結束,沒有簡單的答案,因爲HTTP自然是無狀態的。因此,我們必須假設,如果用戶沒有返回網站,經過了一定的時間,會話應該關閉。這隻能通過cookie過期或通過與會話數據上的時間戳進行比較從持久性介質中刪除會話記錄來實施,並使用我們選擇的任意超時。 ASP.NET中的默認值是20分鐘。

有趣的一點是,當使用SQL Server作爲ASP.NET的會話持久性介質時,它使用計劃的SQL Server代理任務來清除過期的會話。但是,如果Agent未運行或不受支持(例如SQL Server Express版本),則過期的會話不會被清除,因此只要用戶持續呈現相同的會話令牌,會話就不會結束。實際上,會話將在用戶關閉瀏覽器時結束,因爲Cookie 應該然後被自動丟棄。

但是,要回答您的具體問題,請注意我一直在討論應用程序服務器(ASP.NET)環境中的會話。Web服務器(IIS)完全沒有會話的概念 - 它只是在服務和讀取Cookie時將它傳遞給ASP.NET。

+1

如果會話在物理上不存在,**持久會話數據**是什麼? – smwikipedia

+0

這只是App Server與唯一會話令牌關聯的數據。 –

2

物理上,它是用來保持客戶端和服務器之間某種連接狀態的內存空間。在ASP.NET上,Session是用戶唯一的;這與應用程序所有用戶共享的內存空間Cache不同。

通常會話通過cookie維護(服務器發送一個cookie包含一個唯一的會話ID的客戶端瀏覽器),但是當瀏覽器不接受Cookie,它通常是通過形式的URL參數維護:http://site.com?SessionID=312da312312。服務器使用此SessionID來跟蹤誰在進行連接。

按道理,Wikipedia有概念的一個很好的解釋:

在計算機科學,特別是網絡,一個會話是 半永久性的互動信息交流,也被稱爲 對話,在對話或兩個或多個通信設備之間或計算機與用戶之間的會議(請參閱登錄 會話)。會話在 的某個時間點建立或建立,並在稍後的時間點被拆除。已建立的通信會話可能涉及每個方向上的多於一條消息。會話通常但不總是有狀態的,意味着至少一個通信部分需要保存關於會話歷史的信息以便能夠通信,如 與無狀態通信相反,其中通信包括 獨立請求和答覆。

建立的會話是執行面向連接的通信的基本要求。會話也是以無連接通信模式發送的基本步驟。然而,任何 單向傳輸不定義會話1

+0

非常好,但我試圖阻止人們使用無Cookie(URL令牌)會話,因爲如果URL被重用(由搜索引擎索引,在鏈接等中複製),它們可能會造成嚴重破壞 –

+0

@JamesMcCormack:毫無疑問,是相關的嚴重安全隱患。 – Icarus

0

這裏是MSDN link

基本上有3點不同的方式來存儲會話。在進程/狀態服務器/ SQL中。

進程存儲在IIS中,如果您重新啓動或重新啓動Web服務器,則會丟失。它是最快的,但它並沒有持續下去。

狀態服務器:它是一個與您的.NET應用程序無關的進程外工作進程。但是,如果您的服務器重新啓動,則會丟失該會話,但您可以重新啓動應用程序池。

SQL:它存儲在SQL中並始終保留。