一、中文譯名
Ø Cookie:小餅干? 偶用盡所有的方法都沒有找到其中文譯名, 就連偶一直非常信任的金山詞霸對其也只是一段解釋而非譯名。(如果哪位高人能譯出,請一定要告知金山公司讓他們?nèi)ジ略~庫)
Ø Session:會話
Ø Cache:高速緩沖存儲器
二、工作機制
Ø Cookie:采用的是客戶端保存信息的方案。
Ø Session:采用服務(wù)器端保存信息的方案。
Ø Cache:利用緩存SRAM來“靜態(tài)”的保存寫入信息的方案。
如果上面的“專業(yè)”解釋你還是不能明白,那我們就來“通俗”的解釋它們吧!
1.Cookie客戶端的機制就是用戶訪問站點時,Web服務(wù)器發(fā)送給該用戶的不僅僅是一個頁面,還有一個包含日期和時間的Cookie。用戶的瀏覽器在獲得頁面的同時還得到了這個Cookie,并且將它保存在用戶硬盤上的某個文件夾中。
Cookie是一段文本信息,你可以在你的電腦硬盤中找到許多這種文件,它們通常存放在C:\Documents and Settings\用戶名\Cookies(早于Win2000以前的系統(tǒng)則會存放在c:\windows\Cookies)。
那么Web服務(wù)器通過Cookie究竟寫下了些什么呢?它們用有什么作用呢?
這些就要看Web服務(wù)器的code如何寫的了,不過你可以不必?fù)?dān)心,服務(wù)器在Cookie里寫下的信息只是為了你下次訪問該站點時節(jié)約時間或提供一些特定的服務(wù)(絕非病毒或是其它可疑滴東東)。而且某些信息數(shù)據(jù)是加密的(例如密碼等),當(dāng)然也可以通過設(shè)置瀏覽器讓它不記錄下Cookie。
應(yīng)用舉例:一些要求用戶登錄的站點則可以通過Cookie來確定您是否已經(jīng)登錄過,這樣您就不必每次都輸入登錄信息;一些站點的投票功能可以簡單地利用Cookie作為布爾值,表示您的瀏覽器是否已經(jīng)參與了投票,從而避免您重復(fù)投票。
2.Session服務(wù)端的機制是將用戶的請求信息放在服務(wù)器端來保存信息,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)來保存信息。當(dāng)程序需要為某個客戶端的請求創(chuàng)建一個session的時候,服務(wù)器首先檢查這個客戶端的請求里是否已包含了一個session標(biāo)識 - 稱為session id,如果已包含一個session id則說明以前已經(jīng)為此客戶端創(chuàng)建過session,服務(wù)器就按照session id把這個session檢索出來使用。
保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標(biāo)識發(fā)送給服務(wù)器。由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務(wù)器。經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把session id直接附加在URL路徑的后面。
這就好像是我們?nèi)ツ承┥痰耆ベI東西,如果你已是該店的會員,那么商店會給你一張會員卡,下次你再次光顧這家店時只要出示你的會員卡就可以享受訂制的服務(wù)了。
由于session只認(rèn)id不認(rèn)人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲方式都會對它的識別產(chǎn)生影響,這時就容易出現(xiàn)了我們常說的session混亂了。
還是以上面會員店為例,如忘帶會員卡或是會員卡上的照片已經(jīng)是你好幾年前的樣子店員無法辨認(rèn),商店會重新給你辦理一張會員卡。而此時其實你已經(jīng)有兩張會員卡了(session id)正好這兩張卡的服務(wù)范圍不一樣(一張是普通卡,一張是VIP卡),當(dāng)你再次去商店你任意的給了商店一張卡,這樣你得到的服務(wù)有可能根本不是你想要的。
當(dāng)然如果程序?qū)懙暮檬强梢员苊膺@種混亂的情況,有時還可以是跨應(yīng)用程序的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ù)預(yù)寫到其中,需要時直接從它讀出,這就縮短了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)存里。
如果設(shè)置了過期時間,瀏覽器就會把cookie保存到硬盤上,關(guān)閉后再次打開瀏覽器,這些cookie依然有效直到超過設(shè)定的過期時間。有些論壇在你登錄時有記住登錄信息1個月這類的時間選擇,這就是為Cookie設(shè)置了過期時間。這時我們就算關(guān)閉了瀏覽器,再次打開訪問這個論壇時仍然會是在線狀態(tài)不需要再次登錄。
Ø Session
和Cookie不一樣,用戶關(guān)閉瀏覽器Session仍然保存在服務(wù)器端,只要程序發(fā)出指令去刪除session,服務(wù)器會一直保留這個會話對象直到它處于非活動狀態(tài)超過設(shè)定的間隔為止。
我們有時會誤解當(dāng)用戶關(guān)閉瀏覽器時Session已經(jīng)被刪除,是由于大部分session機制都使用cookie來保存session id,而關(guān)閉瀏覽器后這個session id就消失了,再次連接到服務(wù)器時也就無法找到原來的session。
Ø Cache
由于Cache的機制我們很明顯的可以看出,只有關(guān)閉電腦電源或是讓程序重寫Cache。不然這個Cache將會一直存在。
.NET Framework 常規(guī)參考
sessionState 元素(ASP.NET 設(shè)置架構(gòu))
為當(dāng)前應(yīng)用程序配置會話狀態(tài)設(shè)置。
configuration 元素(常規(guī)設(shè)置架構(gòu)) system.web 元素(ASP.NET 設(shè)置架構(gòu)) sessionState 元素(ASP.NET 設(shè)置架構(gòu))
<sessionState mode="[Off|InProc|StateServer|SQLServer|Custom]" timeout="number of minutes" cookieName="session identifier cookie name" cookieless= "[true|false|AutoDetect|UseCookies|UseUri|UseDeviceProfile]" regenerateExpiredSessionId="[True|False]" sqlConnectionString="sql connection string" sqlCommandTimeout="number of seconds" allowCustomSqlDatabase="[True|False]" useHostingIdentity="[True|False]" stateConnectionString="tcpip=server:port" stateNetworkTimeout="number of seconds" customProvider="custom provider name"> <providers>...</providers> </sessionState>

屬性和元素
下面幾部分描述了屬性、子元素和父元素。
屬性
allowCustomSqlDatabase
|
可選的 Boolean 屬性。
指定會話狀態(tài) SQL 數(shù)據(jù)庫是否可以是自定義數(shù)據(jù)庫(而不是 ASP.NET 默認(rèn)數(shù)據(jù)庫)。如果為 false,則不能指定初始目錄或數(shù)據(jù)庫作為 sqlConnectionString 屬性的值。默認(rèn)會話狀態(tài) SQL 數(shù)據(jù)庫為 ASPState 數(shù)據(jù)庫。有關(guān)更多信息,請參見會話狀態(tài)模式。
此屬性是 .NET Framework 2.0 版中的新屬性。
默認(rèn)值為 false。
|
cookieless
|
可選的 HttpCookieMode 屬性。
指定對于 Web 應(yīng)用程序使用 Cookie 的方式。
cookieless 屬性可以為下列可能值之一。默認(rèn)值為 UseCookies。
AutoDetect
|
ASP.NET 確定請求瀏覽器或請求設(shè)備是否支持 Cookie。如果請求瀏覽器或請求設(shè)備支持 Cookie,則 AutoDetect 使用 Cookie 來保留用戶數(shù)據(jù);否則,將在查詢字符串中使用一個標(biāo)識符。如果瀏覽器或設(shè)備支持 Cookie,但當(dāng)前禁用了 Cookie,則請求功能仍會使用 Cookie。
|
UseCookies
|
無論瀏覽器或設(shè)備是否支持 Cookie,都使用 Cookie 來保留用戶數(shù)據(jù)。
|
UseDeviceProfile
|
ASP.NET 根據(jù) HttpBrowserCapabilities 設(shè)置來確定是否使用 Cookie。如果 HttpBrowserCapabilities 設(shè)置指示瀏覽器或設(shè)備支持 Cookie,將使用 Cookie;否則,將在查詢字符串中使用一個標(biāo)識符。
|
UseUri
|
無論瀏覽器或設(shè)備是否支持 Cookie,調(diào)用功能都使用查詢字符串來存儲標(biāo)識符。
|
|
cookieName
|
可選的 String 屬性。
指定存儲會話標(biāo)識符的 Cookie 的名稱。
此屬性是 .NET Framework 2.0 版中的新屬性。
默認(rèn)值為 "ASP.NET_SessionId"。
|
customProvider
|
可選的 String 屬性。
指定用于存儲和檢索會話狀態(tài)數(shù)據(jù)的自定義會話狀態(tài)提供程序的名稱。該提供程序在 providers 元素中指定。僅當(dāng)會話狀態(tài)模式設(shè)置為 Custom 值時,才使用該提供程序。有關(guān)更多信息,請參見會話狀態(tài)模式。
此屬性是 .NET Framework 2.0 版中的新屬性。
默認(rèn)值為空字符串 ("")。
|
mode
|
可選的 SessionStateMode 屬性。
指定存儲會話狀態(tài)值的位置。有關(guān)更多信息,請參見會話狀態(tài)模式。
mode 屬性可以為下列可能值之一。默認(rèn)值為 InProc。
Custom
|
會話狀態(tài)將使用自定義數(shù)據(jù)存儲區(qū)來存儲會話狀態(tài)信息。
|
InProc
|
會話處于正在處理 ASP.NET 輔助進(jìn)程的狀態(tài)。
|
Off
|
會話狀態(tài)被禁用。
|
SQLServer
|
會話狀態(tài)將使用進(jìn)程外 SQL Server 數(shù)據(jù)庫來存儲狀態(tài)信息。
|
StateServer
|
會話狀態(tài)將使用進(jìn)程外 ASP.NET 狀態(tài)服務(wù)來存儲狀態(tài)信息。
|
|
partitionResolverType
|
可選的 String 屬性。
指定在哪里存儲會話狀態(tài)。如果 partitionResolverType 屬性中指定了值,則忽略 sqlConnectionString 和 stateConnectionString 屬性。PartitionResolverType 屬性返回的連接字符串將用于每個請求,為請求的其余部分連接到適當(dāng)?shù)姆?wù)器位置。如果連接字符串無效,ASP.NET 將引發(fā)一個異常,該異常與當(dāng)配置的服務(wù)器連接字符串無效時引發(fā)的異常相同。該屬性用于在 SQL 或狀態(tài)服務(wù)器模式下在多個后端節(jié)點上劃分會話狀態(tài)數(shù)據(jù)。
此屬性是 .NET Framework 2.0 版中的新屬性。
默認(rèn)值為空字符串。
|
regenerateExpiredSessionId
|
可選的 Boolean 屬性。
指定當(dāng)客戶端指定了過期的會話 ID 時是否重新發(fā)出會話 ID。默認(rèn)情況下,當(dāng)啟用了 regenerateExpiredSessionId 時,僅為 cookieless 模式重新發(fā)出會話 ID。有關(guān)更多信息,請參見 IsCookieless。
此屬性是 .NET Framework 2.0 版中的新屬性。
默認(rèn)值為 true。
|
sqlCommandTimeout
|
可選的 TimeSpan 屬性。
指定使用 SQL Server 會話狀態(tài)模式的 SQL 命令的持續(xù)時間超時(秒)。持續(xù)時間超時是 SQL 命令可以處于空閑狀態(tài)的時間(秒),超過此時間之后,該命令將被取消。
此屬性是 .NET Framework 2.0 版中的新屬性。
默認(rèn)值為 0:00:30(30 秒)。
|
sqlConnectionString
|
可選的 String 屬性。
為運行 SQL Server 的計算機指定連接字符串。該屬性在 mode 屬性設(shè)置為 SQLServer 值時是必需的。有關(guān)更多信息,請參見會話狀態(tài)模式。
若要在使用 SQLServer 模式時提高您的應(yīng)用程序的安全性,請使用受保護(hù)的配置來加密配置的 sessionState 節(jié),以幫助保護(hù) sqlConnectionString 值。
|
默認(rèn)值為 "data source=127.0.0.1;Integrated Security=SSPI"。
|
stateConnectionString
|
可選的 String 屬性。
指定遠(yuǎn)程存儲會話狀態(tài)的服務(wù)器名稱或地址以及端口。端口值必須為 42424。當(dāng) mode 為 StateServer 值時,該屬性是必需的。確保運行 ASP.NET 狀態(tài)服務(wù)的服務(wù)器是存儲會話狀態(tài)信息的遠(yuǎn)程服務(wù)器。該服務(wù)隨 ASP.NET 一起安裝,默認(rèn)情況下為 %SystemRoot%\Microsoft.NET\Framework\VersionNumber\aspnet_state.exe。有關(guān)更多信息,請參見會話狀態(tài)模式。
默認(rèn)值為 "tcpip=127.0.0.1:42424"。
|
stateNetworkTimeout
|
可選的 TimeSpan 屬性。
指定 Web 服務(wù)器與狀態(tài)服務(wù)器之間的 TCP/IP 網(wǎng)絡(luò)連接可以處于空閑狀態(tài)的時間(秒),超過此時間后,請求將被取消。該屬性在 mode 屬性設(shè)置為 StateServer 值時使用。
默認(rèn)值為 10 秒。
|
timeout
|
可選的 TimeSpan 屬性。
指定在放棄一個會話前該會話可以處于空閑狀態(tài)的分鐘數(shù)。對于進(jìn)程內(nèi)和狀態(tài)服務(wù)器模式,timeout 屬性不能設(shè)置為大于 525,601 分鐘(1 年)的值。
會話 timeout 配置設(shè)置僅適用于 ASP.NET 頁。更改會話 timeout 值不會影響 ASP 頁的會話超時時間。同樣,更改 ASP 頁的會話超時時間不會影響 ASP.NET 頁的會話超時時間。
默認(rèn)值為 20 分鐘。
|
useHostingIdentity
|
可選的 Boolean 屬性。
指定會話狀態(tài)將恢復(fù)為宿主標(biāo)識還是使用客戶端模擬。
如果為 true,ASP.NET 將使用下列進(jìn)程憑據(jù)之一來連接會話狀態(tài)存儲區(qū):
宿主進(jìn)程;對于 Microsoft Internet 信息服務(wù) [IIS] 5 和 5.1 版為 ASPNET,對于 Microsoft Windows Server 2003 則為 NETWORK SERVICE。
如果為 false,ASP.NET 將使用目前與當(dāng)前請求的操作系統(tǒng)線程關(guān)聯(lián)的憑據(jù)來連接會話狀態(tài)存儲區(qū)。對于客戶端模擬,ASP.NET 將使用與瀏覽器協(xié)商的安全憑據(jù)來連接會話狀態(tài)存儲區(qū)。如果為 false,ASP.NET 在連接會話狀態(tài)存儲區(qū)時不會恢復(fù)為進(jìn)程標(biāo)識或應(yīng)用程序模擬標(biāo)識。有關(guān)更多信息,請參見 ASP.NET 模擬。
此屬性是 .NET Framework 2.0 版中的新屬性。
默認(rèn)值為 true。
在 .NET Framework 1.1 版中,如果 mode 屬性設(shè)置為 SQLServer,并且客戶端模擬有效,則 ASP.NET 使用來自 ASP.NET 客戶端模擬的客戶端憑據(jù)連接到運行 SQL Server 的計算機。
|
|
繼承的屬性
|
可選的屬性。
由所有節(jié)元素繼承的屬性。
|
子元素
providers
|
包含自定義會話狀態(tài)存儲區(qū)提供程序的集合。
|
父元素
configuration
|
公共語言運行庫和基于 .NET Framework 的應(yīng)用程序所使用的每個配置文件中均需要的根元素。
|
system.web
|
指定配置文件中 ASP.NET 配置設(shè)置的根元素,并包含用于配置 ASP.NET Web 應(yīng)用程序和控制應(yīng)用程序行為方式的配置元素。
|

備注
sessionState 元素配置當(dāng)前應(yīng)用程序的會話狀態(tài)設(shè)置。
新客戶端在開始與 Web 應(yīng)用程序交互時,會發(fā)出一個會話 ID,并且該 ID 將與會話有效期間從同一客戶端發(fā)出的所有后續(xù)請求關(guān)聯(lián)。此 ID 用于在不同的請求中保持與客戶端會話關(guān)聯(lián)的服務(wù)器端狀態(tài)。sessionState 元素控制 ASP.NET 應(yīng)用程序如何為每個客戶端建立并保持這種關(guān)聯(lián)。
這種機制非常靈活,可以為您提供許多功能,其中包括承載進(jìn)程外的會話狀態(tài)信息,以及在不使用 Cookie 的情況下跟蹤狀態(tài)。
在 URI 中發(fā)送會話 ID 時,可以超過 URI 的最大大小。如果匿名標(biāo)識票證、Forms 身份驗證票證、會話 ID 和用戶數(shù)據(jù)的組合超過了允許的最大 URI 長度,請求將失敗,并發(fā)出“400 錯誤的請求”錯誤。
使用 StateServer 模式
在將要存儲會話狀態(tài)信息的遠(yuǎn)程服務(wù)器上,確保 ASP.NET 狀態(tài)服務(wù)正在運行。
使用 SQLServer 模式
在運行將要存儲會話狀態(tài)的 SQL Server 的計算機上運行 InstallSqlState.sql。