小白开学Asp.Net Core 《十》
小白开学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上去看),有机会再谈。
参考文章: