一、中文譯名 Ø Cookie:小餅干? 偶用盡所有的方法都沒有找到其中文譯名, 就連偶一直非常信任的金山詞霸對其也只是一段解釋而非譯名。(如果哪位高人能譯出,請一定要告知金山公司讓他們?nèi)ジ略~庫) Ø Session:會話 Ø Cache:高速緩沖存儲器
二、工作機制 Ø Cookie:采用的是客戶端保存信息的方案。 Ø Session:采用服務器端保存信息的方案。 Ø Cache:利用緩存SRAM來“靜態(tài)”的保存寫入信息的方案。 如果上面的“專業(yè)”解釋你還是不能明白,那我們就來“通俗”的解釋它們吧!
1.Cookie客戶端的機制就是用戶訪問站點時,Web服務器發(fā)送給該用戶的不僅僅是一個頁面,還有一個包含日期和時間的Cookie。用戶的瀏覽器在獲得頁面的同時還得到了這個Cookie,并且將它保存在用戶硬盤上的某個文件夾中。 Cookie是一段文本信息,你可以在你的電腦硬盤中找到許多這種文件,它們通常存放在C:\Documents and Settings\用戶名\Cookies(早于Win2000以前的系統(tǒng)則會存放在c:\windows\Cookies)。 那么Web服務器通過Cookie究竟寫下了些什么呢?它們用有什么作用呢? 這些就要看Web服務器的code如何寫的了,不過你可以不必擔心,服務器在Cookie里寫下的信息只是為了你下次訪問該站點時節(jié)約時間或提供一些特定的服務(絕非病毒或是其它可疑滴東東)。而且某些信息數(shù)據(jù)是加密的(例如密碼等),當然也可以通過設(shè)置瀏覽器讓它不記錄下Cookie。 應用舉例:一些要求用戶登錄的站點則可以通過Cookie來確定您是否已經(jīng)登錄過,這樣您就不必每次都輸入登錄信息;一些站點的投票功能可以簡單地利用Cookie作為布爾值,表示您的瀏覽器是否已經(jīng)參與了投票,從而避免您重復投票。
2.Session服務端的機制是將用戶的請求信息放在服務器端來保存信息,服務器使用一種類似于散列表的結(jié)構(gòu)來保存信息。當程序需要為某個客戶端的請求創(chuàng)建一個session的時候,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識 - 稱為session id,如果已包含一個session id則說明以前已經(jīng)為此客戶端創(chuàng)建過session,服務器就按照session id把這個session檢索出來使用。 保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標識發(fā)送給服務器。由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器。經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把session id直接附加在URL路徑的后面。 這就好像是我們?nèi)ツ承┥痰耆ベI東西,如果你已是該店的會員,那么商店會給你一張會員卡,下次你再次光顧這家店時只要出示你的會員卡就可以享受訂制的服務了。 由于session只認id不認人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲方式都會對它的識別產(chǎn)生影響,這時就容易出現(xiàn)了我們常說的session混亂了。 還是以上面會員店為例,如忘帶會員卡或是會員卡上的照片已經(jīng)是你好幾年前的樣子店員無法辨認,商店會重新給你辦理一張會員卡。而此時其實你已經(jīng)有兩張會員卡了(session id)正好這兩張卡的服務范圍不一樣(一張是普通卡,一張是VIP卡),當你再次去商店你任意的給了商店一張卡,這樣你得到的服務有可能根本不是你想要的。 當然如果程序?qū)懙暮檬强梢员苊膺@種混亂的情況,有時還可以是跨應用程序的session共享。
3.Cache“靜態(tài)”機制跟比起以上兩種方式就特殊一些。為什么說它是“靜態(tài)”,是因為它是有程序?qū)懭氲?/span>SRAM里的,除非是重新寫入數(shù)據(jù)或關(guān)閉電源,否則寫入的數(shù)據(jù)是會保持不變的。 由于CPU的存取數(shù)據(jù)速度比從內(nèi)存和硬盤中存取數(shù)據(jù)的速度要快得多,從內(nèi)存和硬盤中存取數(shù)據(jù)時會使CPU等待,影響計算機的速度。SRAM的存取速度比其它內(nèi)存和硬盤都要快,所以它被用作電腦的高速緩存。 有了高速緩存,可以先把數(shù)據(jù)預寫到其中,需要時直接從它讀出,這就縮短了CPU的等待時間。高速緩存之所以能提高系統(tǒng)的速度是基于一種統(tǒng)計規(guī)律,主板上的控制系統(tǒng)會自動統(tǒng)計內(nèi)存中哪些數(shù)據(jù)會被頻繁的使用,就把這些數(shù)據(jù)存在高速緩存中,CPU要訪問這些數(shù)據(jù)時,就會先到Cache中去找,從而提高整體的運行速度。
三、生命周期區(qū)別 Ø Cookie 如果不設(shè)置過期時間,則表示這個cookie生命周期為瀏覽器會話期間,只要關(guān)閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽會話期的cookie被稱為會話cookie。會話cookie一般不保存在硬盤上而是保存在內(nèi)存里。 Ø Session 和Cookie不一樣,用戶關(guān)閉瀏覽器Session仍然保存在服務器端,只要程序發(fā)出指令去刪除session,服務器會一直保留這個會話對象直到它處于非活動狀態(tài)超過設(shè)定的間隔為止。 我們有時會誤解當用戶關(guān)閉瀏覽器時Session已經(jīng)被刪除,是由于大部分session機制都使用cookie來保存session id,而關(guān)閉瀏覽器后這個session id就消失了,再次連接到服務器時也就無法找到原來的session。 Ø Cache 由于Cache的機制我們很明顯的可以看出,只有關(guān)閉電腦電源或是讓程序重寫Cache。不然這個Cache將會一直存在。
為當前應用程序配置會話狀態(tài)設(shè)置。 下面幾部分描述了屬性、子元素和父元素。 allowCustomSqlDatabase 可選的 Boolean 屬性。 指定會話狀態(tài) SQL 數(shù)據(jù)庫是否可以是自定義數(shù)據(jù)庫(而不是 ASP.NET 默認數(shù)據(jù)庫)。如果為 false,則不能指定初始目錄或數(shù)據(jù)庫作為 sqlConnectionString 屬性的值。默認會話狀態(tài) SQL 數(shù)據(jù)庫為 ASPState 數(shù)據(jù)庫。有關(guān)更多信息,請參見會話狀態(tài)模式。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 false。 cookieless 可選的 HttpCookieMode 屬性。 指定對于 Web 應用程序使用 Cookie 的方式。 cookieless 屬性可以為下列可能值之一。默認值為 UseCookies。 AutoDetect ASP.NET 確定請求瀏覽器或請求設(shè)備是否支持 Cookie。如果請求瀏覽器或請求設(shè)備支持 Cookie,則 AutoDetect 使用 Cookie 來保留用戶數(shù)據(jù);否則,將在查詢字符串中使用一個標識符。如果瀏覽器或設(shè)備支持 Cookie,但當前禁用了 Cookie,則請求功能仍會使用 Cookie。 UseCookies 無論瀏覽器或設(shè)備是否支持 Cookie,都使用 Cookie 來保留用戶數(shù)據(jù)。 UseDeviceProfile ASP.NET 根據(jù) HttpBrowserCapabilities 設(shè)置來確定是否使用 Cookie。如果 HttpBrowserCapabilities 設(shè)置指示瀏覽器或設(shè)備支持 Cookie,將使用 Cookie;否則,將在查詢字符串中使用一個標識符。 UseUri 無論瀏覽器或設(shè)備是否支持 Cookie,調(diào)用功能都使用查詢字符串來存儲標識符。 cookieName 可選的 String 屬性。 指定存儲會話標識符的 Cookie 的名稱。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 "ASP.NET_SessionId"。 customProvider 可選的 String 屬性。 指定用于存儲和檢索會話狀態(tài)數(shù)據(jù)的自定義會話狀態(tài)提供程序的名稱。該提供程序在 providers 元素中指定。僅當會話狀態(tài)模式設(shè)置為 Custom 值時,才使用該提供程序。有關(guān)更多信息,請參見會話狀態(tài)模式。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為空字符串 ("")。 mode 可選的 SessionStateMode 屬性。 指定存儲會話狀態(tài)值的位置。有關(guān)更多信息,請參見會話狀態(tài)模式。 mode 屬性可以為下列可能值之一。默認值為 InProc。 Custom 會話狀態(tài)將使用自定義數(shù)據(jù)存儲區(qū)來存儲會話狀態(tài)信息。 InProc 會話處于正在處理 ASP.NET 輔助進程的狀態(tài)。 Off 會話狀態(tài)被禁用。 SQLServer 會話狀態(tài)將使用進程外 SQL Server 數(shù)據(jù)庫來存儲狀態(tài)信息。 StateServer 會話狀態(tài)將使用進程外 ASP.NET 狀態(tài)服務來存儲狀態(tài)信息。 partitionResolverType 可選的 String 屬性。 指定在哪里存儲會話狀態(tài)。如果 partitionResolverType 屬性中指定了值,則忽略 sqlConnectionString 和 stateConnectionString 屬性。PartitionResolverType 屬性返回的連接字符串將用于每個請求,為請求的其余部分連接到適當?shù)姆掌魑恢?。如果連接字符串無效,ASP.NET 將引發(fā)一個異常,該異常與當配置的服務器連接字符串無效時引發(fā)的異常相同。該屬性用于在 SQL 或狀態(tài)服務器模式下在多個后端節(jié)點上劃分會話狀態(tài)數(shù)據(jù)。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為空字符串。 regenerateExpiredSessionId 可選的 Boolean 屬性。 指定當客戶端指定了過期的會話 ID 時是否重新發(fā)出會話 ID。默認情況下,當啟用了 regenerateExpiredSessionId 時,僅為 cookieless 模式重新發(fā)出會話 ID。有關(guān)更多信息,請參見 IsCookieless。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 true。 sqlCommandTimeout 可選的 TimeSpan 屬性。 指定使用 SQL Server 會話狀態(tài)模式的 SQL 命令的持續(xù)時間超時(秒)。持續(xù)時間超時是 SQL 命令可以處于空閑狀態(tài)的時間(秒),超過此時間之后,該命令將被取消。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 0:00:30(30 秒)。 sqlConnectionString 可選的 String 屬性。 為運行 SQL Server 的計算機指定連接字符串。該屬性在 mode 屬性設(shè)置為 SQLServer 值時是必需的。有關(guān)更多信息,請參見會話狀態(tài)模式。 若要在使用 SQLServer 模式時提高您的應用程序的安全性,請使用受保護的配置來加密配置的 sessionState 節(jié),以幫助保護 sqlConnectionString 值。 默認值為 "data source=127.0.0.1;Integrated Security=SSPI"。 stateConnectionString 可選的 String 屬性。 指定遠程存儲會話狀態(tài)的服務器名稱或地址以及端口。端口值必須為 42424。當 mode 為 StateServer 值時,該屬性是必需的。確保運行 ASP.NET 狀態(tài)服務的服務器是存儲會話狀態(tài)信息的遠程服務器。該服務隨 ASP.NET 一起安裝,默認情況下為 %SystemRoot%\Microsoft.NET\Framework\VersionNumber\aspnet_state.exe。有關(guān)更多信息,請參見會話狀態(tài)模式。 若要在使用 StateServer 模式時提高您的應用程序的安全性,請使用受保護的配置來加密配置的 <sessionState> 節(jié),以幫助保護 stateConnectionString 值。 默認值為 "tcpip=127.0.0.1:42424"。 stateNetworkTimeout 可選的 TimeSpan 屬性。 指定 Web 服務器與狀態(tài)服務器之間的 TCP/IP 網(wǎng)絡(luò)連接可以處于空閑狀態(tài)的時間(秒),超過此時間后,請求將被取消。該屬性在 mode 屬性設(shè)置為 StateServer 值時使用。 默認值為 10 秒。 timeout 可選的 TimeSpan 屬性。 指定在放棄一個會話前該會話可以處于空閑狀態(tài)的分鐘數(shù)。對于進程內(nèi)和狀態(tài)服務器模式,timeout 屬性不能設(shè)置為大于 525,601 分鐘(1 年)的值。 會話 timeout 配置設(shè)置僅適用于 ASP.NET 頁。更改會話 timeout 值不會影響 ASP 頁的會話超時時間。同樣,更改 ASP 頁的會話超時時間不會影響 ASP.NET 頁的會話超時時間。 默認值為 20 分鐘。 useHostingIdentity 可選的 Boolean 屬性。 指定會話狀態(tài)將恢復為宿主標識還是使用客戶端模擬。 如果為 true,ASP.NET 將使用下列進程憑據(jù)之一來連接會話狀態(tài)存儲區(qū): 宿主進程;對于 Microsoft Internet 信息服務 [IIS] 5 和 5.1 版為 ASPNET,對于 Microsoft Windows Server 2003 則為 NETWORK SERVICE。 如果為 false,ASP.NET 將使用目前與當前請求的操作系統(tǒng)線程關(guān)聯(lián)的憑據(jù)來連接會話狀態(tài)存儲區(qū)。對于客戶端模擬,ASP.NET 將使用與瀏覽器協(xié)商的安全憑據(jù)來連接會話狀態(tài)存儲區(qū)。如果為 false,ASP.NET 在連接會話狀態(tài)存儲區(qū)時不會恢復為進程標識或應用程序模擬標識。有關(guān)更多信息,請參見 ASP.NET 模擬。 此屬性是 .NET Framework 2.0 版中的新屬性。 默認值為 true。 在 .NET Framework 1.1 版中,如果 mode 屬性設(shè)置為 SQLServer,并且客戶端模擬有效,則 ASP.NET 使用來自 ASP.NET 客戶端模擬的客戶端憑據(jù)連接到運行 SQL Server 的計算機。 繼承的屬性 可選的屬性。 由所有節(jié)元素繼承的屬性。 providers 包含自定義會話狀態(tài)存儲區(qū)提供程序的集合。 configuration 公共語言運行庫和基于 .NET Framework 的應用程序所使用的每個配置文件中均需要的根元素。 system.web 指定配置文件中 ASP.NET 配置設(shè)置的根元素,并包含用于配置 ASP.NET Web 應用程序和控制應用程序行為方式的配置元素。 sessionState 元素配置當前應用程序的會話狀態(tài)設(shè)置。 新客戶端在開始與 Web 應用程序交互時,會發(fā)出一個會話 ID,并且該 ID 將與會話有效期間從同一客戶端發(fā)出的所有后續(xù)請求關(guān)聯(lián)。此 ID 用于在不同的請求中保持與客戶端會話關(guān)聯(lián)的服務器端狀態(tài)。sessionState 元素控制 ASP.NET 應用程序如何為每個客戶端建立并保持這種關(guān)聯(lián)。 這種機制非常靈活,可以為您提供許多功能,其中包括承載進程外的會話狀態(tài)信息,以及在不使用 Cookie 的情況下跟蹤狀態(tài)。 在 URI 中發(fā)送會話 ID 時,可以超過 URI 的最大大小。如果匿名標識票證、Forms 身份驗證票證、會話 ID 和用戶數(shù)據(jù)的組合超過了允許的最大 URI 長度,請求將失敗,并發(fā)出“400 錯誤的請求”錯誤。 在將要存儲會話狀態(tài)信息的遠程服務器上,確保 ASP.NET 狀態(tài)服務正在運行。 在運行將要存儲會話狀態(tài)的 SQL Server 的計算機上運行 InstallSqlState.sql。 |