当前位置: 移动技术网 > IT编程>开发语言>.net > 小白开学Asp.Net Core 《十》

小白开学Asp.Net Core 《十》

2019年07月27日  | 移动技术网IT编程  | 我要评论

小白开学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 = 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上去看),有机会再谈。

参考文章:

  

  

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网