Http
HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了。 Cookie是通过客户端保持状态的解决方案。

Cookie

Cookie实际上是一小段的文本信息保存在客户端。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器。Cookie也是保存在浏览器端,而且浏览器会在每次请求的时候都会把和这个站点的相关的Cookie提交到服务器,并且将服务端返回的Cookie更新回数据库,因此可以将信息保存在Cookie中,然后在服务器端读取、修改(看报文)。

Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。

Cookie的缺点:还不能存储过多信息,机密信息不能存(不要把不希望用户看到的或者不能被用户篡改的信息放到Cookie)。Cookie:是可以被清除,不能把不能丢的数据存到Cookie中,也许没到Expires就已经过期了。

Session

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session和Cookie关系

由于Cookie是保存在客户端,容易丢失和篡改不安全,一般程序把用户信息保存在Session存储在服务端程序保存session的同时会默认生成一个 SessionId保存在Cookie当中,每次客户端请求都会携带这SessionId请求服务端,然后服务端根据SessionId取出用户信息。

Session失效:一般没有设置过期时间的话默认失效时间为20分钟 ,如果用户关闭浏览器的话,Session并没有过期,而是客户端丢失了Cookie中的 session 无法使用之前的seesion信息只能重新登录获取新的session信息,之前的session20分钟以后会自动清除。

Session缺点:默认的Session是进程内的,存储在IIS(web服务器)的内存中如果服务器重启会导致 seesion数据全部丢失,而且部署多个服务器的话session 之间的信息不可以共享,我们可以使用进程 外session存储在sqlserver等数据库当中或者是redis当中。

Asp.net 中存储session

Session保存到SQL Server中:
1.首先要创建用于保存Session数据的数据库,以命令行的形式用aspnet_regsql.exe来完成,具体命令为
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -ssadd -sstype c
 -d <数据库名> -S <你的计算机名或者IP地址> -U <用户名> -P <密码>

参数说明:
-ssadd            添加对 SQLServer 模式会话状态的支持。
-sstype t|p|c     会话状态支持的类型:

                  t:
                  临时。会话状态数据存储在“tempdb”数据库中。用于管理会话的存储过程安装在“ASPState”数据库中。如果重新启动
                  SQL,则不保持数据。(默认)

                  p: 保持。会话状态数据和存储过程都存储在“ASPState”数据库中。

                  c: 自定义。会话状态数据和存储过程都存储在自定义数据库中。必须
指定该数据库的名称。
-d                -sstype 为“c”时使用的自定义数据库的名称。

2.需要修改ASP.NET web.config文件中的SessionState结点,该结点位于<system.web>下

<sessionState mode="SQLServer" allowCustomSqlDatabase="true"
sqlConnectionString="server=.;uid=sa;password=123456;initial catalog=Marx"
cookieless="false" timeout="20">
</sessionState>

Session保存在stateserver中 参考:https://www.cnblogs.com/whtydn/p/5081052.html

Asp.net core中存储Session

 asp.net core 中使用Session首先要安装Microsoft.AspNetCore.Session安装包。然后在Startup类中配置。Session是基于IDistributedCache构建的,因此必须先配置好Session,否则会报错。
 

services.AddSession(options => { options.Cookie.Name = "Test.Session"; options.IdleTimeout = TimeSpan.FromSeconds(10); });

在Configure中调用 app.UseSession(),需要在app.UseMvc使用之前调用。 ASP.NET core Session存储 提供了IDistributedCache的多种实现,默认是存储在本地内存当中, 微软为我们提供了很多种存储方式 我们可以在调用addsession

前添加配置换成,services.AddDistributedMemoryCache();

添加redis services.AddDistributedRedisCache(options =>{options.Configuration = "localhost";}); 等替换存储方式。