小白开学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

相关文章
相关标签/搜索