(一) 描述
當用戶在 Web 應用程序中導航 ASP.NET 頁時,ASP.NET 會話狀態使您可以存儲和檢索用戶的值。HTTP 是一種無狀態協議。這意味着 Web 服務器會將針對頁面的每一個 HTTP 請求做爲獨立的請求進行處理。服務器不會保留之前的請求過程當中所使用的變量值的任何信息。
ASP.NET 會話狀態未來自限定時間範圍內的同一瀏覽器的請求標識爲一個會話,當每一個用戶首次與這臺WWW服務器創建鏈接時,他就與這個服務器創建了一個Session,同時服務器會自動爲其分配一個SessionID,用以標識這個用戶的惟一身份。Session提供用於在該會話持續期間內保留變量值的方法。默認狀況下,將爲全部 ASP.NET 應用程序啓用ASP.NET 會話狀態.
會話變量能夠是任何有效的 .NET Framework 類型, 注意:當使用 InProc 之外的會話狀態模式時,會話變量類型必須爲基元 .NET 類型或可序列化的類型。這是由於會話變量值存儲在外部數據存儲區中。
會話由一個惟一標識符標識,可以使用 SessionID 屬性讀取此標識符。爲 ASP.NET 應用程序啓用會話狀態時,將檢查應用程序中每一個頁面請求是否有瀏覽器發送的 SessionID 值。若是未提供任何 SessionID 值,則 ASP.NET 將啓動一個新會話,並將該會話的 SessionID 值隨響應一塊兒發送到瀏覽器。
默認狀況下,SessionID 值存儲在 Cookie 中。但也能夠將應用程序配置爲在「無 Cookie」會話的 URL 中存儲 SessionID 值。只要一直使用相同的 SessionID 值來發送請求,會話就被視爲活動的。若是特定會話的請求間隔超過指定的超時值(以分鐘爲單位),則該會話被視爲已過時。使用過時的 SessionID 值發送的請求將生成一個新的會話。
安全說明:
不管是做爲 Cookie 仍是做爲 URL 的一部分,System.Web.SessionState.HttpSessionState.SessionID 值都以明文的形式發送。惡意用戶經過獲取 SessionID 值並將其包含在對服務器的請求中,能夠訪問另外一位用戶的會話。若是您將敏感信息存儲在會話狀態中,建議使用 SSL 來加密瀏覽器和服務器之間包含 SessionID 值的任何通訊。
默認狀況下,SessionID 值存儲在瀏覽器的不過時會話 Cookie 中。可是,經過在 Web.config 文件的 sessionState 節中將 cookieless 屬性設置爲 true,能夠指定不該將會話標識符存儲在 Cookie 中。
<configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
ASP.NET 經過自動在頁的 URL 中插入惟一的會話 ID 來保持無 Cookie 會話狀態。例如,下面的 URL 已被 ASP.NET 修改,以包含惟一的會話 ID lit3py55t21z5v55vlm25s55:
http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx
(二)配置會話狀態
經過使用 system.web 配置節的 sessionState 元素可配置會話狀態。還能夠經過使用 @ Page 指令中的 EnableSessionState 值來配置會話狀態。
使用 sessionState 元素可指定如下選項:
• 會話存儲數據所使用的模式。
• 在客戶端和服務器間發送會話標識符值的方式。
• 會話的 Timeout 值。
• 支持基於會話 Mode 設置的值。
下面的示例演示一個 sessionState 元素,該元素將配置應用程序的 SQLServer 會話模式。該元素將 Timeout 值設置爲 30 分鐘,並指定將會話標識符存儲在 URL 中。
<sessionState mode="SQLServer"
cookieless="true "
regenerateExpiredSessionId="true "
timeout="30"
sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
stateNetworkTimeout="30"/>
能夠經過將會話狀態模式設置爲 Off 來禁用應用程序的會話狀態。若是隻但願禁用應用程序的某個特定頁的會話狀態,則能夠將 @ Page 指令中的 EnableSessionState 值設置爲 false。還可將 EnableSessionState 值設置爲 ReadOnly 以提供對會話變量的只讀訪問。
注意:timeout是指會話的時間,單位是分鐘,也就是若是客戶端在timeout的時間內沒有向服務器放送過請求,會話終止,全部的session數據將丟失。
(三)會話模式
ASP.NET 會話狀態支持若干用於會話數據的存儲選項。每一個選項都由 SessionStateMode 枚舉中的一個值標識。下面的列表描述了可用的會話狀態模式:
• InProc 模式,此模式將會話狀態存儲在 Web 服務器上的內存中。這是默認設置。
• StateServer 模式,此模式將會話狀態存儲在一個名爲 ASP.NET 狀態服務的單獨進程中。這確保了在從新啓動 Web 應用程序時會保留會話狀態,並讓會話狀態可用於網絡場中的多個 Web 服務器。
• SQLServer 模式將會話狀態存儲到一個 SQL Server 數據庫中。這確保了在從新啓動 Web 應用程序時會保留會話狀態,並讓會話狀態可用於網絡場中的多個 Web 服務器。
• Custom 模式,此模式容許您指定自定義存儲提供程序。
• Off 模式,此模式禁用會話狀態。
經過在應用程序的 Web.config 文件中爲 sessionState 元素的 mode 屬性分配一個 SessionStateMode 枚舉值,能夠指定要讓 ASP.NET 會話狀態使用的模式。除了 InProc 和 Off 以外,其餘模式都須要附加參數,例如將在本主題後面討論的鏈接字符串值。經過訪問 HttpSessionStateMode 屬性的值,能夠查看當前選定的會話狀態。
(四)示例
1. Login.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form. id="form1" runat="server">
html
</form>
</body>
</html>
Login.aspx.cs
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void mLoginButton_Click(object sender, EventArgs e)
{
Session["loginName"] = "Jack Wang" + DateTime.Now.ToString();
Response.Redirect("Default.aspx");
}
}
2. Default.aspx頁
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Session Sample</title>
</head>
<body>
<form. id="form1" runat="server">
web
</form>
</body>
</html>
Default.aspx.cs
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Response.AddHeader("Refresh", (Session.Timeout*1000).ToString() + ";URL=Login.aspx");
if (string.IsNullOrEmpty(Session["loginName"] as string))
{
Response.Redirect("Login.aspx");
}
}
protected void mGetSessionButton_Click(object sender, EventArgs e)
{
mShowSessionContentLabel.Text = "
Now is:" + DateTime.Now.ToString() + "
Session Content:" +
Session["loginName"] as string + "
SessionId:" + Session.SessionID.ToString()
+"
session start time:"+ Session["startTime"] as string;
}
3. 示例不一樣的模式,配置web.config
a. InProc模式
<sessionState mode="InProc" timeout="2"></sessionState>
(1) 測試頁面 ,過兩分鐘後再點擊Get Session將返回到Login.aspx頁,由於session過時
(2)重啓web服務,點擊Get Session將返回到Login.aspx頁,由於session丟失
b. StateServer模式
注意:若是模式設置爲 StateServer,則存儲在會話狀態中的對象必須是可序列化的。
(1)啓動ASP.NET State Service服務
(2)修改SessionState爲以下
<sessionState mode="StateServer" timeout="10" stateConnectionString="tcpip=127.0.0.1:42424">
</sessionState>
(3)重啓web服務器,點擊GetSession,session 10分鐘內不會丟失,由於session存儲服務器的另外一個aspnet_state的進程裏
c. sql server模式
描述:
若是是 SQL Server 模式,則存儲在會話狀態中的對象必須是可序列化的
默認狀況 下,Aspnet_regsql.exe 工具將建立一個名爲 ASPState 的數據庫,該數據庫包含支持 SQLServer 模式的存儲過程。默認狀況下,會話數據自己存儲在 tempdb 數據庫中。您能夠選擇使用 -sstype 選項來更改會話數據的存儲位置。下表給出了 -sstype 選項可能的值:
t :將會話數據存儲到 SQL Server tempdb 數據庫中。這是默認設置。若是將會話數據存儲到 tempdb 數據庫中,從新啓動 SQL Server 時將丟失會話數據。
p:將會話數據存儲到 ASPState 數據庫中,而不是存儲到 tempdb 數據庫中。
c :將會話數據存儲到自定義數據庫中。若是指定 c 選項,則還必須使用 -d 選項包括自定義數據庫的名稱。
(1) 進入visual studio 2008(2005) command prompt
(2) 輸入以下紅色的命令
(3) 建立出以下數據庫和表
(4) 運行頁面,而後重啓web服務,點擊Get Session,session不會丟失,由於session保存到sql server數據庫裏了。 sql