session的存儲方式和配置方法介紹
session其實分為客戶端Session和服務(wù)器端Session。
當(dāng)用戶首次與Web服務(wù)器建立連接的時候,服務(wù)器會給用戶分發(fā)一個 SessionID作為標(biāo)識。SessionID是一個由24個字符組成的隨機(jī)字符串。用戶每次提交頁面,瀏覽器都會把這個SessionID包含在 HTTP頭中提交給Web服務(wù)器,這樣Web服務(wù)器就能區(qū)分當(dāng)前請求頁面的是哪一個客戶端。這個SessionID就是保存在客戶端的,屬于客戶端Session。
其實客戶端Session默認(rèn)是以cookie的形式來存儲的,所以當(dāng)用戶禁用了cookie的話,服務(wù)器端就得不到SessionID。這時我們可以使用url的方式來存儲客戶端Session。也就是將SessionID直接寫在了url中,當(dāng)然這種方法不常用。
我們大多數(shù)提到的Session都是指服務(wù)器端Session。他有三種存儲方式(自定義存儲在這里不做討論):
1.1保存在IIS進(jìn)程中:
保存在IIS進(jìn)程中是指把Session數(shù)據(jù)保存在IIS的運行的進(jìn)程中,也就是inetinfo.exe這個進(jìn)程中,這也是默認(rèn)的Session的存方式,也是最常用的。
這種方式的優(yōu)點是簡單,性能最高。但是當(dāng)重啟IIS服務(wù)器時Session丟失。
1.2.保存在StateServer上
這種存儲模式是指將Session數(shù)據(jù)存儲在一個稱為Asp.Net狀態(tài)服務(wù)進(jìn)程中,該進(jìn)程獨立于Asp.Net輔助進(jìn)程或IIS應(yīng)用程序池的單獨進(jìn)程,使用此模式可以確保在重新啟動Web應(yīng)用程序時保留會話狀態(tài),并使會話狀態(tài)可以用于網(wǎng)絡(luò)中的多個Web服務(wù)器。
1.3.保存在SQL Server數(shù)據(jù)庫中
可以配置把Session數(shù)據(jù)存儲到SQL Server數(shù)據(jù)庫中,為了進(jìn)行這樣的配置,程序員首先需要準(zhǔn)備SQL Server數(shù)據(jù)服務(wù)器,然后在運行.NET自帶安裝工具安裝狀態(tài)數(shù)據(jù)庫。
這種方式在服務(wù)器掛掉重啟后都還在,因為他存儲在內(nèi)存和磁盤中。
下面是這三種方式的比較:
|
InProc |
StateServer |
SQLServer | |
|
存儲物理位置 |
IIS進(jìn)程(內(nèi)存) |
Windows服務(wù)進(jìn)程(內(nèi)存) |
SQLServer數(shù)據(jù)庫(磁盤) |
|
存儲類型限制 |
無限制 |
可以序列化的類型 |
可以序列化的類型 |
|
存儲大小限制 |
無限制 | ||
|
使用范圍 |
當(dāng)前請求上下文,對于每個用戶獨立 | ||
|
生命周期 |
第一次訪問網(wǎng)站的時候創(chuàng)建Session超時后銷毀 | ||
|
優(yōu)點 |
性能比較高 |
Session不依賴Web服務(wù)器,不容易丟失 | |
|
缺點 |
容易丟失 |
序列化與反序列化消耗CPU資源 |
序列化與反序列化消耗CPU資源,從磁盤讀取Session比較慢 |
|
使用原則 |
不要存放大量數(shù)據(jù) | ||
Web.config文件中的Session配置信息:
<sessionState mode="Off|InProc|StateServer|SQLServer"
cookieless="true|false"
timeout="number of minutes"
stateConnectionString="tcpip=server:port"
sqlConnectionString="sql connection string"
stateNetworkTimeout="number of seconds"
/>
mode 設(shè)置將Session信息存儲到哪里:
— Off 設(shè)置為不使用Session功能;
— InProc 設(shè)置為將Session存儲在進(jìn)程內(nèi),就是ASP中的存儲方式,這是默認(rèn)值;
— StateServer 設(shè)置為將Session存儲在獨立的狀態(tài)服務(wù)中;
— SQLServer 設(shè)置將Session存儲在SQL Server中。
cookieless 設(shè)置客戶端的Session信息存儲到哪里:
— ture 使用Cookieless模式;這時客戶端的Session信息就不再使用Cookie存儲了,而是將其通過URL存儲。比如網(wǎng)址為http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx
— false 使用Cookie模式,這是默認(rèn)值。
timeout 設(shè)置經(jīng)過多少分鐘后服務(wù)器自動放棄Session信息。默認(rèn)為20分鐘。
stateConnectionString 設(shè)置將Session信息存儲在狀態(tài)服務(wù)中時使用的服務(wù)器名稱和端口號,例如:"tcpip=127.0.0.1:42424”。當(dāng)mode的值是StateServer是,這個屬性是必需的。(42424是默認(rèn)端口)。
sqlConnectionString 設(shè)置與SQL Server連接時的連接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。當(dāng)mode的值是SQLServer時,這個屬性是必需的。
stateNetworkTimeout 設(shè)置當(dāng)使用StateServer模式存儲Session狀態(tài)時,經(jīng)過多少秒空閑后,斷開Web服務(wù)器與存儲狀態(tài)信息的服務(wù)器的TCP/IP連接的。默認(rèn)值是10秒鐘。
下面來說下用StateServer和SqlServer來存儲Session的方法
2.1 StateServer
第1步是打開狀態(tài)服務(wù)。依次打開“控制面板”→“管理工具”→“服務(wù)”命令,找到ASP.NET狀態(tài)服務(wù)一項,右鍵單擊服務(wù)選擇啟動。
如果你正式?jīng)Q定使用狀態(tài)服務(wù)存儲Session前,別忘記修改服務(wù)為自啟動(在操作系統(tǒng)重啟后服務(wù)能自己啟動)以免忘記啟動服務(wù)而造成網(wǎng)站Session不能使用
第2步,在system.web節(jié)點中加入:stateNetworkTimeout="20"> stateConnectionString表示狀態(tài)服務(wù)器的通信地址(IP:服務(wù)端口號)。由于我們現(xiàn)在在本機(jī)進(jìn)行測試,這里設(shè)置成本機(jī)地址127.0.0.1。狀態(tài)服務(wù)默認(rèn)的監(jiān)聽端口為42422。當(dāng)然,您也可以通過修改注冊表來修改狀態(tài)服務(wù)的端口號。
(修改注冊表來修改狀態(tài)服務(wù)的端口號的方法:在運行中輸入regedit啟動注冊表編輯器—依次打開HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters節(jié)點,雙擊Port選項—選擇基數(shù)為十進(jìn)制,然后輸入一個端口號即可。)
2.2 SqlServer
在SQL Server中執(zhí)行一個叫做InstallSqlState.sql的腳本文件。這個腳本文件將在SQL Server中創(chuàng)建一個用來專門存儲Session信息的數(shù)據(jù)庫,及一個維護(hù)Session信息數(shù)據(jù)庫的SQL Server代理作業(yè)。我們可以在以下路徑中找到那個文件:
[system drive]\winnt\Microsoft.NET\Framework\[version]\
然后打開查詢分析器,連接到SQL Server服務(wù)器,打開剛才的那個文件并且執(zhí)行。稍等片刻,數(shù)據(jù)庫及作業(yè)就建立好了。這時,你可以打開企業(yè)管理器,看到新增了一個叫ASPState的數(shù)據(jù)庫。
修改mode的值改為SQLServer。注意,還要同時修改sqlConnectionString的值,格式為:sqlConnectionString="data source=localhost; Integrated Security=SSPI;"(這種是通過windows集成身份驗證)
3、Session的生命周期
Session的生命周期其實在第一節(jié)已經(jīng)講過了,和不同的存儲過程有關(guān)。
4、遍歷以及銷毀Session
4.1遍歷:
System.Collections.IEnumerator SessionEnum = Session.Keys.GetEnumerator();
while (SessionEnum.MoveNext())
{
Response.Write(Session[SessionEnum.Current.ToString()].ToString() + " ");
}
4.2 銷毀:Session.Abandon()。
相關(guān)文章
比較經(jīng)典技術(shù)普及帖 以你剛才在淘寶上買了一件東西
你發(fā)現(xiàn)快要過年了,于是想給你的女朋友買一件毛衣,你打開了taobao。這時你的瀏覽器首先查詢DNS服務(wù)器,將taobao轉(zhuǎn)換成ip地址2012-06-06
idea2023連接gitee遠(yuǎn)程倉庫的實現(xiàn)方法
在我們平時做項目的過程中,經(jīng)常會遇到分工合作,一起完成一個項目,就會借助其它的一些項目管理工具,來幫助我們更方便的開發(fā),本文主要介紹了idea2023連接gitee遠(yuǎn)程倉庫的實現(xiàn)方法,感興趣的可以了解一下2024-01-01
Hadoop框架起步之圖解SSH、免密登錄原理和實現(xiàn)方法
這篇文章主要介紹了Hadoop框架起步之圖解SSH、免密登錄原理和實現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
關(guān)于GBK與UTF-8互轉(zhuǎn)亂碼問題解讀
GBK與UTF-8互轉(zhuǎn)亂碼問題,是因為編碼和解碼方式不一致導(dǎo)致的,UTF-8編碼的字符在GBK中解碼可能會出現(xiàn)亂碼,而GBK編碼的字符在UTF-8中解碼則通??梢赃€原,ISO-8859-1編碼是單字節(jié)編碼,可以保證亂碼字符串的還原2025-02-02
基于 Dubbo Admin 動態(tài)調(diào)整服務(wù)超時時間的操作步驟
Dubbo提供動態(tài)調(diào)整超時時間的服務(wù)治理能力,可以在無需重啟應(yīng)用的情況下,動態(tài)調(diào)整服務(wù)超時時間,這篇文章主要介紹了基于 Dubbo Admin 動態(tài)調(diào)整服務(wù)超時時間,需要的朋友可以參考下2022-12-12
Git基礎(chǔ)之git與SVN版本控制優(yōu)缺點區(qū)別分析
這篇文章主要為大家介紹了Git基礎(chǔ)之git與SVN優(yōu)缺點及區(qū)別分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

