小白開學Asp.Net Core 《十》
— — Session、Cookie、Cache(老生常談)
一、背景
在常談Session和Cookie之前我們先來簡單的瞭解下Http(可以說這是必須的,預設大家都瞭解)
總結一句話:HTTP是一種無狀態的協議,在不採取特殊手段的情況下,HTTP請求是不保留使用者值或應用狀態的資訊。
Session跟蹤是Web程式中常用的技術,用來跟蹤使用者的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器記錄資訊確定使用者身份。
二、Cookie和Session
1)Cookie
Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社群發展的一種機制。目前Cookie已經成為標準,所有的主流瀏覽器如IE、Chrome、Firefox、Opera等都支援Cookie。
由於HTTP是一種無狀態的協議,伺服器單從網路連線上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
Cookie 儲存所有請求的資料,因為Cookie是隨每個請求傳送的,他們的大小應該保持最低限度,大多數瀏覽器Cookie大小限制為 4096 個位元組。
由於Cookie 容易被篡改,因此它們必須由伺服器進行驗證。客戶端上的Cookie可能被使用者刪除或者過期。但是 Cookie 通常是客戶端上持久的資料暫留形式。
Cookie 大多數情況下,僅標識使用者,但不對其進行身份驗證。
2)Session
除了使用Cookie,Web應用程式中還經常使用Session來記錄客戶端狀態。Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了伺服器的儲存壓力。Session技術則是服務端的解決方案,它是通過伺服器來保持狀態的。由於Session這個詞彙包含的語義很多,因此需要在這裡明確一下 Session的含義。首先,我們通常都會把Session翻譯成會話。
Session是另一種記錄客戶狀態的機制,不同的是Cookie儲存在客戶端瀏覽器中,而Session儲存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以某種形式記錄在伺服器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查詢該客戶的狀態就可以了。
如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查伺服器上的“客戶明細表”來確認客戶身份。Session相當於程式在伺服器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。
三、Cache
Cache,中文意思是快取,是用來將頻繁訪問的資料,儲存於使用者本地或者是訪問速度很快的儲存介質上,以便於提高訪問速度及響應時間。
通過減少生成內容所需的工作,快取可以顯著提高應用程式的效能和可伸縮性。快取最適用於不經常更改的資料。快取生成的資料副本可以比原始源更快地返回。應編寫和測試應用程式,以便永遠不依賴於快取資料。
與會話無關
四、Cookie、Session與Cache的簡單總結
1)、由於Session依賴於客戶端Cookie(SessionID是存放於Cookie中的),因此不支援Cookie的瀏覽器,Session也會丟失,當然可以用Session Url重寫來解決此問題。
2)、Cookie不建議存放大資料量(如存一個表格資料等),因為Cookie的值在每次Web頁面請求往返的過程中都是要附在Http頭中的,如果太大會佔用客戶端與伺服器端之間的頻寬,如果多個連線訪問就是N*4KB,當使用者多了,就會成為瓶頸之一。
3)、Cache也要佔用伺服器的記憶體,但是比Session要多一些靈活性,但要注意哪些資料需要快取,哪些本就不需要快取。
4)、針對用Cache替換Session,對於單一系統來說,是完全不需要注意什麼的。若是針對單點登入來說,同一賬號可以訪問幾個系統。或者在同一電腦中在不同的頁面中訪問不同的系統,那在做Cache資料儲存時,應該根據不同的系統唯一標識來儲存針對不同系統資料的快取,以達SessionID的作用(當然還有其他實現方案)。否則,對於前面登入的系統,在Cache中永遠是最後一個系統的快取資料,當重新整理前面系統時,始終展現的是最後一個系統的操作。
5)、當然,session也可以不以cache的形式進行處理,因為像redis,memacache中有專門針對session共享的解決方案。
5、.Net Core 的入門使用
1)、Cookie的使用
2)Session的使用
(1)在 ConfigureServices 中加入
services.AddSession();
(2)在 Configure 中注入Session服務
app.UseSession();
(3)使用
//加入 HttpContext.Session.SetString("key", "value"); //取值 HttpContext.Session.GetString("key"); //清除 HttpContext.Session.Remove("key");
** 這裡隨便說一句,通過看原始碼可以看到,.Net Core 預設是用分散式Session實現的(內部使用分散式快取)(這裡就不在深入了,有機會在分享,或者加群(695058251)交流)為了證明沒吹牛,貼圖:
3)Cache
(1)在ConfigureServices中加入
services.AddMemoryCache();
(2)使用
在Controller中新增構造方法,宣告IMemoryChche
請求引數:
[Route("api/[controller]")] [ApiController] public class MemoryTestController : ControllerBase { private IMemoryCache _cache; public MemoryTestController(IMemoryCache memoryCache) { _cache = memoryCache; } //儲存資料 public ActionResult<bool> Set() { var userTest = new UserTest { Id = 1, Name = "Aju" }; var key = "key"; _cache.Set(key, userTest); return true; } //獲取資料 [HttpGet] public ActionResult<UserTest> Get() { var key = "key"; var userTest = _cache.Get<UserTest>(key); return userTest; } }
** cache當然是可以設定過期時間的
_cache.Set(key, userTest, new MemoryCacheEntryOptions() // 設定相對過期時間為5分鐘 .SetSlidingExpiration(TimeSpan.FromMinutes(5))); _cache.Set(key, userTest,new MemoryCacheEntryOptions() // 設定絕對過期時間為5分鐘 .SetAbsoluteExpiration(TimeSpan.FromMinutes(5)));
今天就寫到這裡,如果有同學在使用layui時起到引導作用就可以說達到本篇寫作的目的了。如果還有其他疑問,可以加群交流。
至於分散式快取(也可以到GitHub上去看),有機會再談。
參考文章:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/app-state?view=aspnetcore-2.2
https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/memory?view=aspnetcore-2.2