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

  请参考《.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 = ,
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())); _cache.Set(key, userTest,new MemoryCacheEntryOptions()
// 设置绝对过期时间为5分钟
.SetAbsoluteExpiration(TimeSpan.FromMinutes()));

今天就写到这里,如果有同学在使用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

小白开学Asp.Net Core 《十》的更多相关文章

  1. 小白开学Asp.Net Core 《九》

    小白开学Asp.Net Core <九> — — 前端篇(不务正业) 在<小白开学Asp.Net Core 三>中使用了X-admin 2.x 和 Layui将管理后端的界面重 ...

  2. 小白开学Asp.Net Core 《四》

    小白开学Asp.Net Core<三>                               —— 使用AspectCore-Framework 一.AspectCore-Frame ...

  3. 小白开学Asp.Net Core 《五》

    小白开学Asp.Net Core<五>                               —— 使用.Net Core MVC Filter 一.简介 今天在项目(https:/ ...

  4. 小白开学Asp.Net Core 《六》

    小白开学Asp.Net Core <六> —— 探究.Net Core 跨平台的奥秘 1.写这篇文章的初衷 有好多朋友反馈看不懂我写的开源的一个练手项目(GitHub:https://gi ...

  5. 小白开学Asp.Net Core 《七》

    小白开学Asp.Net Core <七> — — 探究中间件(MiddleWare) 1.何为中间件? 中间件是组装到应用程序管道中以处理请求和响应的家伙,管道中的每个组件都要满足以下两个 ...

  6. 小白开学Asp.Net Core《三》

    小白开学Asp.Net Core<三> ——界面 我胡汉三再次又回来了(距离上篇时间有点长),今天抽时间将最近对框架采用的后台界面做个记录 1.先上图 (图一) (图二) 2.界面说明 后 ...

  7. 小白开学Asp.Net Core《二》(补)

    小白开学Asp.Net Core<二>(补) ——数据仓储层(Repositroy).服务层(Service) -------------------------------------- ...

  8. 小白开学Asp.Net Core《二》

    小白开学Asp.Net Core<二> ——数据仓储层(Repositroy) 一.历史现象 在后端开发中,数据库操作是最频繁的,每一个开发人员都会接触,甚至不少开发人员每天的工作就是与数 ...

  9. 小白开学Asp.Net Core 《八》

    小白开学Asp.Net Core <八> — — .Net Core 数据保护组件 1.背景 我在搞(https://github.com/AjuPrince/Aju.Carefree)这 ...

随机推荐

  1. hive数据倾斜的解决办法

    数据倾斜是进行大数据计算时常见的问题.主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致. 在hive中遇到数据倾 ...

  2. 08 JS的事件流的概念(重点)

    在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以 ...

  3. chrome浏览器开发者工具F12中某网站的sources下的源码如何批量保存?

    目录 chrome浏览器 开发者工具F12中某网站的sources下的源码如何批量保存 1. 常用保存Sources源码的两种方法 1.1单个文件 1.2 单个页面 2. 问题 3.解决方案 chro ...

  4. yii中find()指定条件

    find()查找指定的条件 $modelName::model->find(); 使用条件对象 $criteria = new CDbCriteria(); $criteria->sele ...

  5. 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用ApplicationPart动态加载控制器和视图

    标题:从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图 作者:Lamond Lu 地址:http://www.cnblogs ...

  6. nginx实现最简单的直播

    系统环境 [root@yunwei-test live]# cat /etc/redhat-release CentOS Linux release (Core) [root@yunwei-test ...

  7. 数据结构与算法---查找算法(Search Algorithm)

    查找算法介绍 在java中,我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 1)线性查找算法 示例: 有一个数列: {1,8, 10, 89, 1000, 123 ...

  8. 基于SpringBoot从零构建博客网站 - 开发设置主页标识和修改个人信息功能

    由于守望博客系统中支持由用户自己设置个人主页的URL的后半段,所以必须要用户设置该标识的功能,而且是用户注册登录之后自动弹出的页面,如果用户没有设置该标识,其它的操作是不能够操作的,同时要求主页标识只 ...

  9. 深入学习Spring框架(一)- 入门

    1.Spring是什么? Spring是一个JavaEE轻量级的一站式开发框架. JavaEE: 就是用于开发B/S的程序.(企业级) 轻量级:使用最少代码启动框架,然后根据你的需求选择,选择你喜欢的 ...

  10. ajax 的登录认证

    在models中 先创建一个表 from django.db import models # Create your models here. class UserInfo(models.Model) ...