更新時(shí)間:2022-01-25 11:51:04 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1060次
Session數(shù)據(jù)保存在服務(wù)器端, 但是每一個(gè)客戶(hù)端都需要保存一個(gè)SessionID, SessionID保存在Cookies中, 關(guān)閉瀏覽器時(shí)過(guò)期.
在向服務(wù)器發(fā)送的HTTP請(qǐng)求中會(huì)包含SessionID, 服務(wù)器端根據(jù)SessionID獲取獲取此用戶(hù)的Session信息.
很多初級(jí)開(kāi)發(fā)人員不知道SessionID和Cookies的關(guān)系, 所以常常認(rèn)為兩者沒(méi)有聯(lián)系. 這是不正確的. 正是因?yàn)镾essionID保存在Cookies中, 所以在我們保存Cookies的時(shí)候,一定要注意不要因?yàn)镃ookies的大小和個(gè)數(shù)問(wèn)題而導(dǎo)致SessionID對(duì)象. 在我們的程序中, 對(duì)SessionID的Cookies有特殊的處理:
/// <summary>
/// 寫(xiě)入cookie.
/// </summary>
/// <param name="day"></param>
/// <returns></returns>
public bool SetCookie(int day)
{
string CookieName = GetType().ToString();
HttpCookie SessionCookie = null;
//對(duì) SessionId 進(jìn)行備份.
if (HttpContext.Current.Request.Cookies["ASP.NET_SessionId"] != null)
{
string SesssionId = HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value.ToString();
SessionCookie = new HttpCookie("ASP.NET_SessionId");
SessionCookie.Value = SesssionId;
}
//省略掉中間的代碼部分.只保留備份SessionID和找回SessionID的邏輯
//如果cookie總數(shù)超過(guò)20 個(gè), 重寫(xiě)ASP.NET_SessionId, 以防Session 丟失.
if (HttpContext.Current.Request.Cookies.Count > 20 && SessionCookie != null)
{
if (SessionCookie.Value != string.Empty)
{
HttpContext.Current.Response.Cookies.Remove("ASP.NET_SessionId");
HttpContext.Current.Response.Cookies.Add(SessionCookie);
}
}
return true;
}
將Session保存在獨(dú)立的服務(wù)器中可以實(shí)現(xiàn)在多臺(tái)Web服務(wù)器之間共享Session.雖然我們也可以自己開(kāi)發(fā)Session存儲(chǔ)系統(tǒng), 但是使用ASP.NET自帶的存儲(chǔ)機(jī)制將更加便捷.
.NET提供了5種保存Seission的方式:
| 方式名稱(chēng) | 存儲(chǔ)方式 | 性能 |
|---|---|---|
| Off | 設(shè)置為不使用Session功能 | 無(wú) |
| InProc | 設(shè)置為將Session存儲(chǔ)在進(jìn)程內(nèi),就是ASP中的存儲(chǔ)方式,這是默認(rèn)值。 | 性能最高 |
| StateServer | 設(shè)置為將Session存儲(chǔ)在獨(dú)立的狀態(tài)服務(wù)中。通常是aspnet_state.exe進(jìn)程. | 性能損失10-15% |
| SQLServer | 設(shè)置將Session存儲(chǔ)在SQL Server中。 | 性能損失10-20% |
| Customer | 自定制的存儲(chǔ)方案 | 由實(shí)現(xiàn)方式確定 |
我們可以在Web.Config中配置程序使用的Session存儲(chǔ)方式.默認(rèn)情況下是InProc, 即保存在IIS進(jìn)程中. 關(guān)于Off, InProc和Customer本文不做講解. 相關(guān)文章大家都可以在網(wǎng)上搜索到。如果大家想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容全面細(xì)致,通俗易懂,適合小白學(xué)習(xí),希望對(duì)大家能夠有所幫助。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)