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

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