【狀態保持】會話狀態Session解析以及原理分析


我們知道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


免責聲明!

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



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