namespace Dpz.Core.Web.Library.Middleware;
/// <summary>
/// 处理HTTP响应中间件
/// </summary>
public class HttpResponseHeaderHandel
{
private readonly RequestDelegate _next;
/// <summary>
///
/// </summary>
/// <param name="next"></param>
public HttpResponseHeaderHandel(RequestDelegate next)
{
_next = next;
}
/// <summary>
///
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
public async Task Invoke(HttpContext httpContext)
{
/*
* from https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers
* 列出哪些 http response headers 对外暴露
* 这里设置为所有
*/
httpContext.Response.Headers.Append("Access-Control-Expose-Headers", "*");
var sessionId = httpContext.Request.Cookies[Program.AuthorizeCookieName + ".SessionId"];
if (string.IsNullOrWhiteSpace(sessionId))
{
httpContext.Response.Cookies.Append(
Program.AuthorizeCookieName + ".SessionId",
Guid.NewGuid().ToString("N"),
new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Strict,
IsEssential = true,
Expires = DateTimeOffset.Now.AddYears(1),
}
);
}
await _next.Invoke(httpContext);
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
HTTP响应头处理中间件分析
这段代码是一个ASP.NET Core中间件,名为HttpResponseHeaderHandel,主要功能是处理HTTP响应头和一些会话相关的操作。以下是它的主要功能:
1. CORS相关头设置
httpContext.Response.Headers.Append("Access-Control-Expose-Headers", "*");
这行代码设置了Access-Control-Expose-Headers响应头为*,表示允许客户端访问所有的响应头。这在跨域请求(CORS)时很重要,默认情况下浏览器只能访问简单的响应头。
2. 会话ID管理
var sessionId = httpContext.Request.Cookies[Program.AuthorizeCookieName + ".SessionId"];
if (string.IsNullOrWhiteSpace(sessionId))
{
httpContext.Response.Cookies.Append(
Program.AuthorizeCookieName + ".SessionId",
Guid.NewGuid().ToString("N"),
new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Strict,
IsEssential = true,
Expires = DateTimeOffset.Now.AddYears(1),
}
);
}
这部分代码检查请求中是否包含名为[Program.AuthorizeCookieName].SessionId的cookie:
- 如果没有找到,则创建一个新的GUID作为会话ID,并设置为cookie
- cookie设置了安全属性:
HttpOnly: 防止JavaScript访问Secure: 只通过HTTPS传输SameSite=Strict: 严格的同站策略IsEssential: 标记为必要cookie- 有效期1年
3. 请求管道继续
await _next.Invoke(httpContext);
最后调用下一个中间件,继续处理管道中的请求。
总结
这个中间件主要做了两件事:
- 设置CORS相关响应头,允许客户端访问所有响应头
- 管理会话ID,确保每个客户端都有一个持久化的会话标识符
这种中间件通常用于需要跨域支持和会话管理的Web应用中。
评论加载中...