session的存儲方式和配置

Session又稱爲會話狀態,是Web系統中最常用的狀態,用於維護和當前瀏覽器實例 相關的一些信息。我們控制用戶去權限中經常用到Session來存儲用戶狀態,這篇文章會講下Session的存儲方式、在web.config中如何配 置Session、Session的生命週期等內容。

 

  1、Session的存儲方式。

  session其實分爲客戶端Session和服務器端Session。

  當用戶首次與Web服務器建立連接的時候,服務器會給用戶分發一個 SessionID作爲標識。SessionID是一個由24個字符組成的隨機字符串。用戶每次提交頁面,瀏覽器都會把這個SessionID包含在 HTTP頭中提交給Web服務器,這樣Web服務器就能區分當前請求頁面的是哪一個客戶端。這個SessionID就是保存在客戶端的,屬於客戶端 Session。

  其實客戶端Session默認是以cookie的形式來存儲的,所以當用戶禁用了cookie的話,服務器端就得不到SessionID。這時我們可以使用url的方式來存儲客戶端Session。也就是將SessionID直接寫在了url中,當然這種方法不常用。

 

  我們大多數提到的Session都是指服務器端Session。他有三種存儲方式(自定義存儲在這裏不做討論):

  1.1保存在IIS進程中:

  保存在IIS進程中是指把Session數據保存在IIS的運行的進程中,也就是inetinfo.exe這個進程中,這也是默認的Session的存方式,也是最常用的。

  這種方式的優點是簡單,性能最高。但是當重啓IIS服務器時Session丟失。

 

  1.2.保存在StateServer上

  這種存儲模式是指將Session數據存儲在一個稱爲Asp.Net狀態服務進程中,該進程獨立於Asp.Net輔助進程或IIS應用程序池的單獨進程,使用此模式可以確保在重新啓動Web應用程序時保留會話狀態,並使會話狀態可以用於網絡中的多個Web服務器。

 

  1.3.保存在SQL Server數據庫中

  可以配置把Session數據存儲到SQL Server數據庫中,爲了進行這樣的配置,程序員首先需要準備SQL Server數據服務器,然後在運行.NET自帶安裝工具安裝狀態數據庫。

  這種方式在服務器掛掉重啓後都還在,因爲他存儲在內存和磁盤中。

  下面是這三種方式的比較:


InProc

StateServer

SQLServer

存儲物理位置

IIS進程(內存)

Windows服務進程(內存)

SQLServer數據庫(磁盤)

存儲類型限制

無限制

可以序列化的類型

可以序列化的類型

存儲大小限制

無限制

使用範圍

當前請求上下文,對於每個用戶獨立

生命週期

第一次訪問網站的時候創建Session超時後銷燬

優點

性能比較高

Session不依賴Web服務器,不容易丟失

缺點

容易丟失

序列化與反序列化消耗CPU資源

序列化與反序列化消耗CPU資源,從磁盤讀取Session比較慢

使用原則

不要存放大量數據

 

 

  2、在web.config中配置Session

  Web.config文件中的Session配置信息:

複製代碼

<sessionState mode=

cookieless=

timeout=

stateConnectionString=

sqlConnectionString=

stateNetworkTimeout=

/>

複製代碼

  mode 設置將Session信息存儲到哪裏:

    — Off 設置爲不使用Session功能;

    — InProc 設置爲將Session存儲在進程內,就是ASP中的存儲方式,這是默認值;

    — StateServer 設置爲將Session存儲在獨立的狀態服務中;

    — SQLServer 設置將Session存儲在SQL Server中。

  

  cookieless 設置客戶端的Session信息存儲到哪裏:

    — ture 使用Cookieless模式;這時客戶端的Session信息就不再使用Cookie存儲了,而是將其通過URL存儲。比如網址爲http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx

    — false 使用Cookie模式,這是默認值。

 

  timeout 設置經過多少分鐘後服務器自動放棄Session信息。默認爲20分鐘。

 

  stateConnectionString 設置將Session信息存儲在狀態服務中時使用的服務器名稱和端口號,例如:"tcpip=127.0.0.1:42424”。當mode的值是StateServer是,這個屬性是必需的。(42424是默認端口)。

 

  sqlConnectionString 設置與SQL Server連接時的連接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。當mode的值是SQLServer時,這個屬性是必需的。

 

  stateNetworkTimeout 設置當使用StateServer模式存儲Session狀態時,經過多少秒空閒後,斷開Web服務器與存儲狀態信息的服務器的TCP/IP連接的。默認值是10秒鐘。

 

  下面來說下用StateServer和SqlServer來存儲Session的方法

  2.1 StateServer

  第1步是打開狀態服務。依次打開“控制面板”→“管理工具”→“服務”命令,找到ASP.NET狀態服務一項,右鍵單擊服務選擇啓動。

  如果你正式決定使用狀態服務存儲Session前,別忘記修改服務爲自啓動(在操作系統重啓後服務能自己啓動)以免忘記啓動服務而造成網站Session不能使用

  第2步,在system.web節點中加入:stateNetworkTimeout="20">  stateConnectionString表示狀態服務器的通信地址(IP:服務端口號)。由於我們現在在本機進行測試,這裏設置成本機地址127.0.0.1。狀態服務默認的監聽端口爲42422。當然,您也可以通過修改註冊表來修改狀態服務的端口號。

  (修改註冊表來修改狀態服務的端口號的方法:在運行中輸入regedit啓動註冊表編輯器—依次打開HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters節點,雙擊Port選項—選擇基數爲十進制,然後輸入一個端口號即可。)

 

  2.2 SqlServer

  在SQL Server中執行一個叫做InstallSqlState.sql的腳本文件。這個腳本文件將在SQL Server中創建一個用來專門存儲Session信息的數據庫,及一個維護Session信息數據庫的SQL Server代理作業。我們可以在以下路徑中找到那個文件:

[system drive]\winnt\Microsoft.NET\Framework\[version]\ 

然後打開查詢分析器,連接到SQL Server服務器,打開剛纔的那個文件並且執行。稍等片刻,數據庫及作業就建立好了。這時,你可以打開企業管理器,看到新增了一個叫ASPState的數據庫。

  修改mode的值改爲SQLServer。注意,還要同時修改sqlConnectionString的值,格式爲:sqlConnectionString="data source=localhost; Integrated Security=SSPI;"(這種是通過windows集成身份驗證)

 

  3、Session的生命週期

  Session的生命週期其實在第一節已經講過了,和不同的存儲過程有關。

 

  4、遍歷以及銷燬Session

  4.1遍歷:

System.Collections.IEnumerator SessionEnum = Session.Keys.GetEnumerator();
 (SessionEnum.MoveNext())
{
    Response.Write(Session[SessionEnum.Current.ToString()].ToString() +  );
}

  4.2 銷燬:Session.Abandon()。

 

作者:Kevin
出處:http://zhangkai2237.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章