ASP.NET Session原理及處理方法


session是怎么存儲,提取的

1.在服務器端有一個session池,用來存儲每個用戶提交session中的數據,Session對於每一個客戶端(或者說瀏覽器實例)是“人手一份”,用戶首次與Web服務器建立連接的時候,服務器會給用戶分發一個SessionID作為標識。SessionID是一個由24個字符組成的隨機字符串。用戶每次提交頁面,瀏覽器都會把這個SessionID包含在HTTP頭中提交給Web服務器,這樣Web服務器就能區分當前請求頁面的是哪一個客戶端,而這個SessionID是一cookie的方式保存的在客戶端的內存中的,如果想要得到Session池中的數據,服務器就會根據客戶端提交的唯一SessionID標識給出相應的數據返回。

Session池中每個客戶端的數據是怎么存儲的

1.存儲在Session池中的數據是全局型的數據,可以跨頁面訪問,每個SessionID中只存儲唯一的數據,如:首先你這樣設定:session["userName"]="admin",然后你在會話還沒結束的session還沒過期的情況下,你又設定:session["userName"]="123";這樣這個SessionID沒變,然而Session池中的數據則被覆蓋。此時session["userName"]的值就是“123”,而不是其它。

2.Session池中的數據不能跨進程訪問。如:打開login.aspx頁面寫入session[“userName”]="admin";然后login頁面不關閉,即此會話不結束,在這是你再在另外一個瀏覽器中打開一個login.aspx頁面則session["userName"]=null

3.輸入賬號密碼,點擊登錄頁面輸出  “admin --- 點擊登錄” ,如果緊接着點擊獲取session按鈕,則頁面只輸出"admin--- 點擊獲取session",如果頁面不關閉,打開另外一個瀏覽器,點擊獲取session按鈕,則頁面沒法應。

session的聲明周期與銷毀

1.session存儲數據計時是滾動計時方式。具體是這樣的,如果你打開寫入session,從寫入開始,此頁面如果一直沒有提交操作,則默認時間是20分鍾,20分鍾后session被服務器自動銷毀,如過有提交操作,服務器會從提交后重新計時以此類推,直至設定時間內銷毀。

2.可以設置session的銷毀時間。

為什么需要Session

ASP.NET頁面是"無狀態"的,這意味着每次向服務器發送一個請求,服務器都會生成一個該頁面的實例。但有時候,我們希望在不同的頁面之間共享信息,比如購物車、用戶信息等,於是,ASP.NET為我們提供了一個服務端的Session機制。

Session是如何工作的

服務端的Session機制是基於客戶端的,也就是說服務端的Session會保存每個客戶端的信息到服務端內存中。具體過程是這樣的:
→客戶端向服務端發出請求
→服務端響應客戶端,並針對該客戶端創建Session和唯一的Session ID
→把Session ID作為key, Session內容作為value,以鍵值對形式存儲到Session State Provider中
→客戶端帶着專屬的Session ID再次向服務端請求
→服務端的Session機制根據客戶端的Session ID,從Session State Provider中取出內容返回給客戶端

優點:
● 跨頁面維持用戶狀態、信息
● 使用方便,並且能存儲任何類型
● 能保存每個客戶端的信息
● 安全的、透明的

缺點:
● 因為Session是保存在服務端的內存中的,隨着客戶端請求的增多,很有可能影響到性能
● 在Web.conig中,sessionState節點的mode屬性,如果設置為"StateServer"或"SQLServer",就必須為存儲到Session中的對象打上[Serializable]。這樣在存儲、讀取Session的時候,不斷地序列化和反序列化,也會影響到性能

Session簡介丶特性

1.Session是一種Web會話中的常用狀態之一。

2.Session提供了一種把信息保存在服務器內存中的方式。他能儲存任何數據類型,包含自定義對象。

3.每個客戶端的Seesion是獨立存儲的。

4.在整個會話過程中,只要SessionID的cookie不丟失,都會保存Session信息的。

5.Session不能跨進程訪問,只能由該會話的用戶訪問。應為提取Session數據的id標識是以Cookie的方式保存到訪問者瀏覽器的緩存里的。

6.當會話終止,或過期時,服務器就清除Session對象。

7.Session常用於保存登錄用戶的ID.

8.Session保存的數據是跨頁面全局型的。

Session的Mode

在Web.config中,sessionState節點有一個mode屬性,它的屬性值代表了Session的Mode。包括:
● InProc
● StateServer
● SQLServer
● Custom
● Off

每一種Mode的設置,會影響到Session機制采用哪種Session State Provider。

□ Off

如果我們想讓Session失效:

<system.web>
    <sessionState mode="off" />
</sytem.web>

□ InProc

這也是ASP.NET Session機制所選用的默認Mode,在該模式下,只保存當前應用程序域的數據。如果重啟服務器,Session保存的數據會全部丟失。

<system.web>
    <sessionState mode="InProc" timeout="30" />
</system.web>

表示Session的有效期是30分鍾。對於一些小網站或者數據量不大的時候,選用這個模式是比較好的。

優點:
● 由於是把Session數據保存在內存中的,所以,獲取數據非常快
● 沒有序列化和反序列化的要求

缺點:
● 如果應用程序域被丟棄、重啟,Session數據會丟失
● 數據量大的時候,消耗過多的內存,影響性能

□ StateServer

選用此選項,意味着把Session的工作交給了當前應用程序域之外的asp.net_state.exe服務,這是一個獨立於IIS之外的Windows服務。如果想啟動該服務,可以通過打開“控制面板--管理工具--服務”,找到ASP.NET State Service這個服務,將其設為自動啟動。

即使重啟ASP.NET進程,Session依然有效,這是StateServer模式的優點。此模式的缺點是涉及過多的序列化和反序列化。

<system.web>
    <sessionState mode="StateServer" stateConnectionSting="tcpip=127.0.0.1:42424" stateNetworkTimeout="40" />
</sytem.web>

● 127.0.0.1 表示默認選用本機
● 42424 表示默認端口
● stateNetworkTimeout用來設置服務器響應、等待客戶端請求的時間,默認是10秒,這里設置為40秒

如果想修改StateServer的默認設置,可以在asp.net_state.exe對應的注冊表中修改。

□ SQLServer

選用此模式,Session數據被序列化,並被保存到SQL Server數據庫中。為了讓Sql Server配合此模式,需要做如下:
→查看版本位置,比如在:C:\Windows\Microsoft.NET\Framework\v4.0.30319
→輸入如下命令
1

-ssadd 表示在SQL Server中添加session state
-sstype p 表示Persisted
-S 表示服務器名
-U 表示SQL Server用戶名
-P 表示SQL Server密碼

→如果一切順利,出現如下提示
2

→數據庫中多了ASPState數據庫,Session數據將被保存到此數據庫的相關表中
3

優點:
● 在重啟IIS后,Session數據不會受影響
● 最安全的Session處理方式

缺點:
● 處理相對緩慢
● 過多的序列化和反序列化

□ Custom

自定義Session機制,通過繼承SessionStateStoreProviderBase類,實現ISessionIDManager接口,等等。

  Session的Event

Session的事件有2個:Session_Start和Session_End。可以在global.asax全局文件中對這2個事件做處理。

void Session_Start(object sender, EventArgs e) 
{
    //TODO
}
void Session_End(object sender, EventArgs e) 
{
    // TODO
}
 
session中保存的數據是在服務端的,而每個用戶如進行登錄操作,都要進行session數據寫入,所以建議慎用session,就是少用。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM