小白開學Asp.Net Core 《十》

小白開學Asp.Net Core 《十》 

            — — Session、Cookie、Cache(老生常談)

1、背景

  在常談Session和Cookie以前咱們先來簡單的瞭解下Http(能夠說這是必須的,默認你們都瞭解)html

  總結一句話:HTTP是一種無狀態的協議,在不採起特殊手段的狀況下,HTTP請求是不保留用戶值或應用狀態的信息。redis

  Session跟蹤是Web程序中經常使用的技術,用來跟蹤用戶的整個會話。經常使用的會話跟蹤技術是Cookie與Session。Cookie經過在客戶端記錄信息肯定用戶身份,Session經過在服務器記錄信息肯定用戶身份。api

2、Cookie和Session

  1)Cookie瀏覽器

    Cookie意爲「甜餅」,是由W3C組織提出,最先由Netscape社區發展的一種機制。目前Cookie已經成爲標準,全部的主流瀏覽器如IE、Chrome、Firefox、Opera等都支持Cookie。緩存

    因爲HTTP是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,不管誰訪問都必須攜帶本身通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工做原理。服務器

    Cookie 存儲全部請求的數據,由於Cookie是隨每一個請求發送的,他們的大小應該保持最低限度,大多數瀏覽器Cookie大小限制爲 4096 個字節。網絡

    因爲Cookie 容易被篡改,所以它們必須由服務器進行驗證。客戶端上的Cookie可能被用戶刪除或者過時。可是 Cookie 一般是客戶端上持久的數據暫留形式。session

    Cookie 大多數狀況下,僅標識用戶,但不對其進行身份驗證。app

  2)Session分佈式

    除了使用Cookie,Web應用程序中還常用Session來記錄客戶端狀態。Session是服務器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增長了服務器的存儲壓力。Session技術則是服務端的解決方案,它是經過服務器來保持狀態的。因爲Session這個詞彙包含的語義不少,所以須要在這裏明確一下 Session的含義。首先,咱們一般都會把Session翻譯成會話。

    Session是另外一種記錄客戶狀態的機制,不一樣的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只須要從該Session中查找該客戶的狀態就能夠了。

    若是說Cookie機制是經過檢查客戶身上的「通行證」來肯定客戶身份的話,那麼Session機制就是經過檢查服務器上的「客戶明細表」來確認客戶身份。Session至關於程序在服務器上創建的一份客戶檔案,客戶來訪的時候只須要查詢客戶檔案表就能夠了。

3、Cache

  Cache,中文意思是緩存,是用來將頻繁訪問的數據,存儲於用戶本地或者是訪問速度很快的存儲介質上,以便於提升訪問速度及響應時間。

  經過減小生成內容所需的工做,緩存能夠顯着提升應用程序的性能和可伸縮性。緩存最適用於不常常更改的數據。緩存生成的數據副本能夠比原始源更快地返回。應編寫和測試應用程序,以便永遠不依賴於緩存數據。

  與會話無關

4、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共享的解決方案。

五、.Net Core 的入門使用

  1)、Cookie的使用

  請參考《.Net Core使用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

相關文章
相關標籤/搜索