我們知道web網站在客戶端存儲數據有三種形式:1. Cookie 2. hidden(隱藏域) 3.QueryString 其中viewstate什么的都是通過第二種方式隱藏域存儲滴。
客戶端存儲數據有三種形式,那服務器端有幾種呢? 嘿嘿 服務器端有:1. Session 2. Application 3. database 4. caching(緩存) 其中session用的較多,當然數據庫是必須的。
好今天的主角是session,開發過管理系統項目(不限大小)的童鞋應該都接觸過session,在管理系統中session最典型的應用就是當用戶登錄后在服務器端記錄客戶的唯一標示(比如用戶名),然后再另外的頁面中使用這個信息,當然也能判斷用戶是否登錄后進入的系統,防止沒有授權直接進入系統。
先看一下怎么使用session吧
//添加一個名為sessionTest的Session並且給他賦值 Session["sessionTest"] = "test"; //讀取Session名為sessionTest的值 Response.Write(Session["sessionTest"].ToString());
1. 很簡單吧!除了人為的創建session,還有就是當客戶端瀏覽器訪問一個站點的時候,服務端會自動創建一個session來存儲客戶端的信息,那么問題來了服務端不可能就一個客戶端訪問吧!會有成千上萬的客戶端訪問它,那么問題又來了,服務端怎么區分不同的客戶端呢?
1.1 說到這就要引入一個新的名詞了什么呢 ? 沒錯 sessionID,那么什么是sessionID呢?
簡單的說當客戶端第一次訪問某個站點的時候,將會在服務端生成一個唯一的Key,然后發送給客戶端,在服務器端通過Key來取得相應的數據。通常,我們將這個key稱為SessionID。
1.2 大家都知道HTTP是無狀態的,那么這個sessionID保存到客戶端的什么地方呢?想想客戶端“我們知道web網站在客戶端存儲數據有三種形式:1. Cookie 2. hidden(隱藏域) 3.QueryString” ,這三個你覺得那個更有可能,沒錯是cookice,當然當客戶端禁用cookice的情況先就會采用存儲在QueryString中。
2. 服務端的session
2.1 在頁面對象或者HttpContext對象中,都有一個名為Session的屬性,在一次會話中,它們引用的都是同一個對象,定義如下
public virtual HttpSessionState Session { get; }
在往上來看看HttpSessionState怎么定義的
public sealed class HttpSessionState : ICollection, IEnumerable
2.1.1 從這個類中我們可以找到操作session 的一些方法,下面是一些常用的方法
1 public void Abandon(); 2 public void Add(string name, object value); 3 public void Clear(); 4 public void Remove(string name); 5 6 public object this[int index] { get; set; } 7 public object this[string name] { get; set; }
從字面意思上就大概知道是什么方法,所以我就不一一解釋了,看到6,7行可以知道session可以通過索引的方式訪問。
2.1.2 這個HttpSessionState來自於SessionStateModule。在每次請求處理過程中,HttpApplication在請求的處理管道中會檢查當前請求的處理程序是否實現了接口IRequiresSessionState,如果實現了,那么SessionStateModule將為這個請求分配HttpSession。同時SessionModule還負責SessionID的生成 CookIeless會話管理。順便提一下在使用一般處理程序的時候,默認情況下並沒有實現這個接口,所以,如果在一般處理程序中使用Session必須實現IRequiresSessionState接口否則會導致異常。
3. 客戶端的SessionID
第一次訪問某站點的報文
從相應報文中可以明顯的看到服務端為客戶端添加了一個Cookice,所以這個Cookice的值就為SessionID,還可以看到服務端並沒有指定這個Cookice的過期時間所以這個Cookice會存儲在內存中當瀏覽器關閉后,Cookice會立即消失。
第二次訪問
從請求報文中很明顯的看到,客戶端想服務端發送了一個名為ASP.NET_SessionId的Cookice