4.应用状态于会话
Http 无状态协议,每次请求几乎都是独立的
Core中如何维护状态
Cookie 客户端存储
Cookie 支持 SESSION,劫持,安全级别 Http。
Cookie名称:Cookie名称必须使用只能用在URL中的字符,一般用字母及数字,不能包含特殊字符,如有特殊字符想要转码。如js操作cookie的时候可以使用escape()对名称转码。
Cookie值:Cookie 值同理Cookie的名称,可以进行转码和加密。
Expires:过期日期,一个 GMT格式的时间,当过了这个日期之后,浏览器就会将这个Cookie删除掉,当不设置这个的时候,Cookie 在浏览器关闭后消失。
Path:一个路径,在这个路径下面的页面才可以访问该 Cookie,一般设为“/”,以表示同一个站点的所有页面都可以访问这个Cookie。
Domain:子域,指定在该子域下才可以访问Cookie,例如要让Cookie在a.test.com下可以访问,但在b.test.com下不能访问,则可将domain设置成a.test.com。
Secure:安全性,指定Cookie是否只能通过https协议访问,一般的Cookie使用HTTP协议既可访问,如果设置了Secure(没有值),则只有当使用 https协议连接时cookie才可以被页面访问。
HttpOnly:如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie 信息
Session 服务端存储
不能跨浏览器共享
过期后浏览器将不再传递 COOKIE
如果没有任何一条 SESSION,将不会生成 COOKIE ,默认20分钟过期
Isession.Clear删除全部会话
不推荐内存存储方式存储 SESSION
我们应该使用 Redis 或 SQL Server 分布式缓存 存储Session,推荐Redis集
群
通过 IDataProtector 加密会话 Cookie
在 ASP.NET CORE 中使用 Session 源码
Install-Package Microsoft.AspNetCore.Session
Microsoft.AspNetCore.App元包中已经包含,无需安装。
三步即可完成 Session 配置:
-
任一 IDistributedCache 内存缓存。 IDistributedCache 实现用作会话后备存储。 有关详细信息,请参阅使用分布式缓存。
-
对 ConfigureServices 中 AddSession 的调用。
-
对 Configure 中 UseSession 的调用。
-
然后就可以通过HttpContext.Session来使用 Session 了。
注意:ASP.NET CORE 中没有 HttpContext.Current
services.TryAddSingleton<IHttpContextAccessor,HttpContextAccessor>();
private readonly IHttpContextAccessor httpContextAccessor;
private ISession session => httpContextAccessor.HttpContext.Session;
这里我们推荐使用,因为统一依赖注入,方便单元测试。
TempData
视图和控制器中公开了 TempData 方案,Keep 和 Peek 方法可读写数据,而
不执行删除,重定向时携带 TempData 数据,默认情况下使用 Cookie 存储,
但也支持Session存储 提供程序实现 TempData。
public class CookieTempDataProvider :
Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataProvider
public class SessionStateTempDataProvider :
Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataProvider
如果启用了 HTTPS 非常不推荐大型 COOKIE 存储,因为加密性能。
适用于:数据量小(500 字节),安全性不高,多服务器共享
查询字符串
通过 URL 传递参数,大小有限,数据敏感,存在跨站伪造 XSRF/CSRF 攻击。用于传
递一些简单不敏感的数据。
隐藏字段
可使用 POST 传递大数据,客户端可能篡改后回发,建议加密,防止 XSRF/CSRF 攻
击,ASP.NET 中可以使用AntiForgeryToken回发验证,防止攻击。
HttpContext.Items
每个请求生命周期内可通过HttpContext.Items可传值,主要用于中间件之间传
递数据。
通过缓存传递数据
可以通过缓存框架传递数据,存取即可。
依赖关系注入