當用戶在 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 中。
<!----><sessionStatemode="SQLServer"
cookieless="true"
regenerateExpiredSessionId="true"
timeout="30"
sqlConnectionString="DataSource=MySQLServer;IntegratedSecurity=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
<!---->Login.aspx.cspublicpartialclassLogin: System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
}
protectedvoidmLoginButton_Click(objectsender,EventArgse)
{
Session["loginName"] ="Jack Wang"+DateTime.Now.ToString();
Response.Redirect("Default.aspx");
}
}
2. Default.aspx頁
<!---->Default.aspx.cs
publicpartialclass_Default: System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
//Response.AddHeader("Refresh", (Session.Timeout*1000).ToString() + ";URL=Login.aspx");
if(string.IsNullOrEmpty(Session["loginName"]asstring))
{
Response.Redirect("Login.aspx");
}
}
protectedvoidmGetSessionButton_Click(objectsender,EventArgse)
{
mShowSessionContentLabel.Text ="<br> Now is:"+DateTime.Now.ToString() +"<br>Session Content:"+
Session["loginName"]asstring+"<br>SessionId:"+ Session.SessionID.ToString()
+"<br>session start time:"+ Session["startTime"]asstring;
}
3. 示例不同的模式,配置web.config
<a. InProc模式
新聞熱點
疑難解答