分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

详解Asp.Net Core中的Cookies

发布时间:2023-09-06 02:13责任编辑:蔡小小关键词:Cookie

目录

  • 详解Asp.Net Core中的cookies
    • 搞懂cookies
    • Asp.Net中cookies的实现
      • 从http中获取cookies
      • 将cookies写入http中
    • 总结及感想

详解Asp.Net Core中的cookies

搞懂cookies

我之前写过一篇文章来介绍cookies,如果你对cookies不是很了解请移步理解cookies这篇文章,这对于我们研究asp.net core中的cookies可以起到很大的帮助。

Asp.Net中cookies的实现

cookies是http协议中header头的一部分,服务器与客户端的cookies传递都是通过header头完成的,那么asp.net core只不过是对http协议的一种实现而已。

从http中获取cookies

要从http中获取cookies,首先我们要获取header头信息,而这部分信息asp.net core已经为我们准备好了,并且也帮我们解析了header头中cookies,我们只需要通过HttpContext.Request.Cookies就可以获取所有的cookies信息。

接下来我们主要研究一下asp.net core是如何做的,在这里语言是否显得苍白许多,我们尽量以贴代码为主:

  • 首先,我们从HttpContext.Request.Cookies对象下手
public abstract class HttpRequest{ ???... ???public abstract IRequestCookieCollection Cookies { get; set; } ???...}

从代码可以可看出Cookies是一个IRequestCookieCollection接口类型,它的实现类型为RequestCookieCollection,接口代码如下:

//从接口代码看该类是一个只读类,为什么会是只读类,这也不难理解,Request是一个请求对象,也就是客户端发往服务器的数据,因为这些数据是供我们来读取验证用的,所以修改并没有什么意义public interface IRequestCookieCollection : IEnumerable<KeyValuePair<string, string>>, IEnumerable{ ???string this[string key] { get; } ???int Count { get; } ???ICollection<string> Keys { get; } ???bool ContainsKey(string key); ???bool TryGetValue(string key, out string value);}
  • 然后,我们再来分析header中的cookies是如何被解析到Request中的Cookies对象的

    DefaultHttpRequest是如何实现HttpRequest的:

    public class DefaultHttpRequest : HttpRequest{ ?... ?//这是一个委托对象,用于生成RequestCookiesFeature实例 ?private readonly static Func<IFeatureCollection, IRequestCookiesFeature> _newRequestCookiesFeature = f => new RequestCookiesFeature(f); ?... ?//这个方法属性展示了如何去实例化RequestCookiesFeature对象 ???private IRequestCookiesFeature RequestCookiesFeature =>_features.Fetch(ref _features.Cache.Cookies, _newRequestCookiesFeature); ???//这里直接调用RequestCookiesFeature ???public override IRequestCookieCollection Cookies ???{ ?????get { return RequestCookiesFeature.Cookies; } ?????set { RequestCookiesFeature.Cookies = value; } ???}}

    RequestCookiesFeature.Cookies才是真正触发cookies解析的地方:

     public class RequestCookiesFeature : IRequestCookiesFeature { ?public IRequestCookieCollection Cookies ???{ ??????get ??????{ ?????????... ?????????//从请求中获取header信息,headers是一个IDictionary<string,StringValues>类型 ?????????var headers = HttpRequestFeature.Headers; ?????????StringValues current; ?????????//从headers字典类型中获取cookies的信息,这里获取的current结果是个字符串类型 ?????????if (!headers.TryGetValue(HeaderNames.Cookie, out current)) ?????????{ ?????????????current = string.Empty; ?????????} ?????????if (_parsedValues == null || _original != current) ?????????{ ?????????????_original = current; ?????????????//这里开始将cookies字符串解析为cookies集合类型 ?????????????_parsedValues = RequestCookieCollection.Parse(current.ToArray()); ?????????} ????}}//RequestCookieCollection.Parse代码如下:public class RequestCookieCollection : IRequestCookieCollection{ ?public static RequestCookieCollection Parse(IList<string> values) ???{ ?????... ????????IList<CookieHeaderValue> cookies; ????????//最有用的一句代码在这里,将字符串集合解析为IList<CookieHeaderValue> ????????if (CookieHeaderValue.TryParseList(values, out cookies)) ????????{ ?????????????... ????????} ????????... ?????}}
  • 最终,CookieHeaderParser才是真正干活的地方:

 internal class CookieHeaderParser : HttpHeaderParser<CookieHeaderValue> { ?public sealed override bool TryParseValue(StringSegment value, ref int index, out CookieHeaderValue parsedValue) ???{ ?????... ???} }

将cookies写入http中

  • 我们先来看看Response.Cookies.Append是如何实现的

    Response.Cookies是一个HttpRespnse对象,而ResponseCookies则是IResponseCookies的默认实现

public class ResponseCookies : IResponseCookies{ ??????//通过Append方法来添加cookie ???public void Append(string key, string value) ???{ ???????//这里构造一个cookie对象 ???????var setCookieHeaderValue = new SetCookieHeaderValue( ???????????Uri.EscapeDataString(key), ???????????Uri.EscapeDataString(value)) ???????????{ ???????????????Path = "/" ???????????}; ???????//然后cookie对象序列化字符串,因为在http协议中cookie的值就是字符串 ???????var cookieValue = setCookieHeaderValue.ToString(); ???????//最后将cookie字符串添加到Headers中,StringValues.Concat将两个字符串转换成string[] ???????//Headers是个字典类型,所有header中数据都是以k-v的形式保存在这个字典中 ???????Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], cookieValue); ???????}
  • 看一下Headers的实现

    HttpResponseHeaders负责将header信息写入响应流

    public partial class HttpResponseHeaders : HttpHeaders{ ???internal void CopyTo(ref BufferWriter<PipeWriter> buffer) ???????{ ?????????//这个方将负责将headers通过流的形式写入响应结果 ???????????????????CopyToFast(ref buffer); ???????????... ???????}}

总结及感想

? 本文介绍了,我对cookies的理解,以及asp.net core中cookies是怎么实现的,对于所有web框架的实现都是大同小异的,如果还有什么不明的地方最好自己能多读几遍代码,多看多思考,最总一切问题都会迎刃而解。

详解Asp.Net Core中的Cookies

原文地址:https://www.cnblogs.com/guodf/p/9609384.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved