我們在寫網站一定會使用到 Session
今天就跟大家分享自製微型 Asp.net Session
分析Session->實作Session->使用Session
在實作之前您必須先了解甚麼是Session
網路上一大堆介紹Session文章在此我就不多介紹
或可以點進之前小弟的介紹文來簡單了解 SessionID.cookie,Session傻傻分不清楚??
簡單說明:
Http協議是一個無狀態協議。
核心是 請求=>處理=>回應
每次請求都是獨立不會記住上一次做了甚麼
Session可以幫我們把資料存在Server記憶體,方便我們下次請求使用
上網連線眾多使用者,Server怎麼知道哪份資料,屬於哪個使用者的? 這就要依靠 SessonID
SessionID就像使用者的號碼牌,可以到Server拿相對應的資料
分析:
- 使用者請求頁面時會攜帶該網域下Cookies。
- Asp.net接收到並使用Key為SessionID的Cookie,使用Cookie的Value來SessionPool中查找屬於使用者的Session。
如果是第一次請求或是沒有SessionID 會幫他產生一個新的並加入回應的Cookie中 - 取得Session物件後就可以在程式中使用。
分析如下圖:
我們作出幾個核心來完成模擬Session:
- SessionPool來存放目前所有Session
- SessionObject (支援快取在系統記憶體中)
模擬HttpContext封裝Session
實作:
我要簡單呈現就選擇使用輕便 [泛型處理常式]
ApplicationContext 模擬HttpContext封裝SessionPool
創建一個靜態的SessionPool物件,因為程式都共用此SessionPool
1 | /// <summary> |
CacheDictionary 負責快取
使用一個 Dictionary 來對Session存取物件設置快取
1 | /// <summary> |
在Task.Delay可以讓物件存放在工作執行緒中 等Delay時間到就呼叫 ContinueWith 將物件消毀
1 | /// <summary> |
SeesionPool 存放所有Session
取Session會判斷此Guid是否有對應的Session物件,沒有會幫她創建一個放在池子中
1 | /// <summary> |
SessionObject 控制讀取時的值 (一般我們所使用的Session)
1 | /// <summary> |
使用:
在建構子中創建一個 ApplicationContext 之後,即可Asp.net那樣來使用Session
1 | private ApplicationContext app; |
上面程式是簡單模擬Session核心作用的程式
但並未處理多執行緒並發讀寫…等等問題,所以建議別再實際專案中使用XD!!
專案使用 VS2015 GitHub原始碼
此文作者:Daniel Shih(石頭)
此文地址: https://isdaniel.github.io/own-session/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!