session的儲存方式和配置

2022-08-03 04:06:11 字數 3694 閱讀 2321

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配置資訊:

mode 設定將session資訊儲存到**:

— off 設定為不使用session功能;

— inproc 設定為將session儲存在程序內,就是asp中的儲存方式,這是預設值;

— stateserver 設定為將session儲存在獨立的狀態服務中;

— sqlserver 設定將session儲存在sql server中。

cookieless 設定客戶端的session資訊儲存到**:

— 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();

while (sessionenum.movenext())

4.2 銷毀:session.abandon()。

幾種session儲存方式比較

原文 集群中session安全和同步是個最大的問題,下面是我收集到的幾種session同步的方案,希望能通過分析其各自的優劣找出其適應的場景。1.客戶端cookie加密 這是我以前採用的方式,簡單,高效。比較好的方法是自己採用cookie機制來實現乙個session,在應用中使用此session實現...

Django配置Session的3種儲存方法

在django中session是通過乙個中介軟體管理的。如果要在應用程式中使用session,需要在settings.py中的middleware classes變數中加入 django.contrib.sessions.middleware.sessionmiddleware django中的se...

變數的儲存方式和儲存類別

1 動態儲存方式與靜態儲存方式 儲存期可以分為靜態儲存期 static storage duration 和動態儲存期 dynamic storage duration 這是由變數的靜態儲存方式和動態儲存方式決定的。所謂靜態儲存方式是指在程式執行期間,系統對變數分配固定的儲存空間。而動態儲存方式則是...