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 配置

  1. 任一 IDistributedCache 内存缓存。 IDistributedCache 实现用作会话后备存储。 有关详细信息,请参阅使用分布式缓存。

  2. 对 ConfigureServices 中 AddSession 的调用。

  3. 对 Configure 中 UseSession 的调用。

  4. 然后就可以通过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回发验证,防止攻击。

(Html  @Htmi.AnuForgeryloken (  enput  "Nev.",  Forrelethod. Put) )

HttpContext.Items

每个请求生命周期内可通过HttpContext.Items可传值,主要用于中间件之间传

递数据。

Middleware 1  Request  // logic  next();  // more logic  Response  Middleware 2  // logic  next();  // more logic  Middleware 3  // logic  // more logic

通过缓存传递数据

可以通过缓存框架传递数据,存取即可。

依赖关系注入

public class MyAppData  // Declare properties and methods  public void ConfigureServices(IServiceC011ection services)  services . ) ;

posted @ 2021-02-08 16:45  农村程序员  阅读(76)  评论(0编辑  收藏  举报