Session—管理用戶會話狀態
什么是狀態管理?
指對同一頁或不同頁的多個請求維護狀態和頁信息的過程
為什么要進行狀態管理?
Web頁是無狀態的,不保存任何用戶請求信息,而且到服務器的每一往返過程都將銷毀並重新創建頁,所以超出單個頁的生命周期之后,頁信息將不存在。
狀態管理的作用
指示用戶信息
使得頁與頁之間、請求與請求之間能夠共享信息
更為快速的數據存儲和讀取
- 從一個客戶到達某個網頁開始,到其離開該網頁為止的這段時間內,服務器會為該用戶分配一個Session,以保存該用戶會話時所需要的信息
- 當用戶在頁面之間切換時,存儲在Session對象中的變量不會被清除,當客戶訪問網頁時,這些變量會一直存在
- Session狀態使用的范圍:使用同一個客戶端(瀏覽器實例)訪問同一個應用程序的所有頁面。
- 雖然Session的大小沒有限制,但是我們千萬不能濫用Session。推薦在Session中存儲少於100K的數據。
- Session是在用戶第一次訪問網站的時候創建的,那么Session是什么時候銷毀的呢?
- 默認情況下,Session的超時時間(Timeout)是20分鍾,用戶保持連續20分鍾不訪問網站,則Session被收回,如果在這20分鍾內用戶又訪問了一次頁面,那么20分鍾重新計時
mode狀態模式
-
對於會話狀態存儲器,ASP.NET提供了3個選項,通過模式設置和相關的屬性對其進行配置:
=”[Off|InProc|StateServer|SQLServer] ”
•InProc(默認):Session存儲在IIS進程中(Web服務器內存)•StateServer:Session存儲在獨立的Windows服務進程中(可以不是Web服務器)•SqlServer:Session存儲在SqlServer數據庫的表中(SqlServer服務器)InProc模式速度比較快,但是每次重新啟動IIS都會導致Session丟失。利用后兩種模式,只能保存序列化的對象,但我們可以把Session從Web服務器中獨立出來,從而減輕Web服務器的壓力,同時減少Session丟失的概率。 三種模式的Session比較
三種模式的Session比較
InProc |
StateServer |
SQLServer |
|
存儲物理位置 |
IIS進程(內存) |
Windows服務進程(內存) |
SQLServer數據庫(磁盤) |
存儲類型限制 |
無限制 |
可以序列化的類型 |
可以序列化的類型 |
使用范圍 |
當前請求上下文,對於每個用戶獨立 |
||
生命周期 |
第一次訪問網站的時候創建Session超時后銷毀 |
||
優點 |
性能比較高 |
Session不依賴Web服務器,不容易丟失 |
|
缺點 |
容易丟失 |
序列化與反序列化消耗CPU資源 |
序列化與反序列化消耗CPU資源,從磁盤讀取Session比較慢 |
使用原則 |
不要存放大量數據 |
Cookie
定義:
Cookie是由服務器端生成,發送給User-Agent(一般是瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給服務器(前提是瀏覽器設置為啟用cookie).當你在瀏覽網站的時候,Web服務器會先送一小小資料放在你的計算機上,Cookies 會幫你在網站上所打的文字或是一些選擇都記錄下來。當下次你再訪問同一個網站,Web服務器會先看看有沒有它上次留下的Cookies資料,有的話,就會依據Cookie里的內容來判斷使用者,送出特定的網頁內容給你。
作用:
服務器可以利用Cookies包含信息的任意性來篩選並經常性維護這些信息,以判斷在HTTP傳輸中的狀態。Cookies最典型的應用是判定注冊用戶是否已經登錄網站,用戶可能會得到提示,是否在下一次進入此網站時保留用戶信息以便簡化登錄手續,這些都是Cookies的功用。另一個重要應用場合是“購物車”之類處理。用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些信息都會寫入Cookies,以便在最后付款時提取信息。
- Cookie可分為兩類:會話Cookie和持久性Cookie。
- 在瀏覽器的處理過程中保留的Cookie稱為會話Cookie,這種Cookie是暫時性的,當關閉瀏覽器后,任何會話Cookie都會丟失。持久性Cookie可以保存幾個月甚至幾年。
- 每個 Cookie 必須有一個唯一的名稱,以便以后從瀏覽器讀取 Cookie 時可以識別它。由於 Cookie 按名稱存儲,因此用相同的名稱命名兩個 Cookie 會導致其中一個 Cookie 被覆蓋。
- 一小段保存在客戶端的數據,位於<Windows安裝盤>:\Documents and Settings\<用戶名>\Cookies
- 用戶每次訪問網站頁面的時候,瀏覽器會根據網站的URL在本地Cookies文件夾內查找是否存在當前網站關聯的Cookie,如有就連同頁面請求一起發送到服務器
- 大多數瀏覽器規定Cookie大小不超過4K,每個站點能保存的Cookie不超過20個,所有站點的Cookie總數不超過300個;
- 只能存儲字符串;
- 安全性差,不要保存保密信息,如用戶名、密碼、信用卡號等。建議敏感數據(如驗證碼)加密后存儲。
保存
HttpCookie cookieValCode = new HttpCookie("ValCode", strValCode);
cookieValCode.Expires = DateTime.Now.AddMinutes(10);
Response.Cookies.Add(cookieValCode);
讀取
Request.Cookies["ValCode"].Value
刪除(過期時間設置為過去的時間)
HttpCookie cookieValCode = Request.Cookies["ValCode"];
cookieValCode.Expires = DateTime.Now.AddMinutes(-1);
Response.Cookies.Add(cookieValCode);
Cache—高速緩存
- 存儲的物理位置。服務器內存。
- 存儲的類型限制。任意類型。
- 狀態使用的范圍。當前請求上下文,所有用戶共用一份。
- 存儲的大小限制。任意大小。
- 生命周期。有多種過期策略控制緩存的銷毀。
- 安全與性能。數據總是存儲在服務端,安全性比較高,但不易存儲過多數據。
- 優缺點與注意事項。檢索數據速度快,過期策略豐富。注意不要把對實時性要求很高的數據放到Cache中,不斷更新Cache會對數據庫造成壓力。