状态管理
大约 2 分钟
状态管理
HTTP 是无状态的协议,请求间用户数据传输的方法:
存储方法 存储机制 Cookie HTTP cookie。 可能包括使用服务器端应用代码存储的数据。 Session State HTTP cookie 和服务器端应用代码 TempData HTTP cookie 或会话状态 Query Strings HTTP 查询字符串 Hidden Fields HTTP 窗体字段 HttpContext.Items 请求上下文,服务器端应用代码 Cache 缓存,服务器端应用代码
Cookie
- 因为 cookie 是随每个请求发送的,所以它们的大小应该保持在最低限度。因此,cookie 应该仅传递数据标志符,数据保存在服务器
- 由于 cookie 易被篡改,因此它们必须由服务器进行验证。
- Cookie 通常用于个性化设置,仅标识用户,但不对其进行身份验证。
Session
会话状态使用应用维护的存储来保存客户端所有请求的数据。
ASP.NET Core 通过向客户端提供包含会话 ID 的 cookie 来维护会话状态。
请勿将敏感数据存储在会话状态中。
内存中缓存提供程序在应用驻留的服务器内存中存储会话数据。
通过 HttpContext.Session 获取会话:
配置会话状态:
builder.Services.AddDistributedMemoryCache(); builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromSeconds(10); // 过期时间,默认20分钟 options.Cookie.Name = ".AdventureWorks.Session"; // 默认为 .AspNetCore.Session,并使用路径 / // 可以使用 InfiniteTimeSpan 来禁用此超时 options.IOTimeout = TimeSpan.FromSeconds(1); // 允许从存储加载会话的最大时长, 默认值为 1 分钟。 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; });
// 在 UseRouting 之后和 MapRazorPages 与 MapDefaultControllerRoute 之前调用 UseSession app.UseSession();
完成将应用写入到该会话后,调用
await feature.Session.CommitAsync
;如果会话储存失败,
CommitAsync
和LoadAsync
将引发异常,应用可以处理异常
QueryString
- 由于 URL 查询字符串是公共的,因此请勿对敏感数据使用查询字符串。
- 查询字符串中包含数据还会使应用遭受跨站点请求伪造 (CSRF) 攻击
HttpContext.Items
用于在处理单个请求时存储数据并在中间件之间传递
public class HttpContextItemsMiddleware { // 可以将 object 用作项键防止冲突 public static readonly object HttpContextItemsMiddlewareKey = new(); public async Task Invoke(HttpContext httpContext) { httpContext.Items[HttpContextItemsMiddlewareKey] = "K-9"; } }
Application
全局对象,所有用户均能够访问
Application.Lock(); Application["name"]="name"; ApplicationUnLock();
Cache
- 缓存数据未与特定请求、用户或会话相关联,因此不要缓存可能由其他用户请求检索的特定于用户的数据。