详解Asp.Net Core中的Cookies

目录

  • 详解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);//这里直接调用RequestCookiesFeaturepublic 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方法来添加cookiepublic 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框架的实现都是大同小异的,如果还有什么不明的地方最好自己能多读几遍代码,多看多思考,最总一切问题都会迎刃而解。

转载于:https://www.cnblogs.com/guodf/p/9609384.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么坚持使用JavaScript

由于JavaScript似乎征服了世界&#xff0c;因此与之相关的所有技术&#xff08;例如Node.js&#xff09;也开始兴起。 所有中间语言&#xff0c;包括TypeScript &#xff0c; CoffeeScript &#xff0c; ClojureScript和Google的Dart都已设定为目标&#xff0c;以使其更容易用J…

python tkinter选择路径控件_Python3 Tkinter选择路径功能的实现方法

效果基于Python3。 在自己写小工具的时候因为这个功能纠结了一会儿&#xff0c;这里写个小例子&#xff0c;供有需要的参考。 小例子&#xff0c;就是点击按钮打开路径选择窗口&#xff0c;选择后把值传给Entry输出。 效果预览 这是选择前&#xff1a;选择&#xff1a;选择后&a…

小程序在父组件执行子组件方法,可适用于下拉刷新上拉加载之后执行子组件方法

当父组件引用了子组件的时候&#xff0c;会遇到父组件执行子组件的方法&#xff0c;比如下拉刷新上拉加载等事件只有在页面中才能检测到&#xff0c;但是获取数据的方法在子组件&#xff0c;这时就可以执行子组件方法。 思路很简单&#xff0c;类似于vue中给子组件加ref执行子…

微型计算机接口与技术的交通灯,微机原理及接口技术课程设计交通灯

微机原理及接口技术课程设计交通灯序言十字道口的红绿灯是交通法规的无声命令&#xff0c;是司机和行人的行为准则。十字道口的交通红绿灯控制是保证交通安全和道路畅通的关键。当前&#xff0c;国内大多数城市正在采用“自动”红绿交通灯&#xff0c;它具有固定的“红灯—绿灯…

小米10pro使用说明书_华为Mate40、华为P40和小米10拍照对比:哪一款最好?

华为Mate 40 Pro、华为P40 Pro和小米10 Pro拍照对比&#xff1a;哪一款最好&#xff1f;华为Mate 40 Pro、小米10至尊纪念版、华为P40 Pro和小米10 Pro三款手机是在DxOMark上排名靠前的4部手机。而我们刚好拥有华为Mate 40 Pro、华为P40 Pro和小米10 Pro三款手机——作为同样搭…

xml和xml解析

1.简介XML XML 可扩展标记语言&#xff0c;传输数据 HTML超文本标记语言&#xff0c;显示数据 XML 文档声明 只能放在第一行&#xff0c;注释不能放在声明之前 <?xml version"1.0" encoding"UTF-8" standalone"no"?> standalone表示文…

JS中的同步异步问题

<script> /* * JS 是单线程 * 同步 异步 * 常见的异步 * 1、定时器 * 2、事件绑定 * 3、ajax请求&#xff08;一般的都是异步&#xff09; * 4、回调函数也可以理解成 异步 * */ var oDiv document.getElementById(div1); consol…

win8.1 计算机 桌面快捷方式,win8.1操作系统中我的电脑在哪里?win8.1我的电脑快捷键添加方法介绍...

很多刚刚接触win8的用户会发现&#xff0c;xp中的“我的电脑”&#xff0c;win7中的“计算机”&#xff0c;到了win8难道只有“资源管理器”了吗&#xff1f;开始菜单里边倒是有“计算机”&#xff0c;但是无法放到桌面。在最新版的win8.1中也是如此&#xff0c;大家会发现熟悉…

小程序修改数组中对象的某个值或者修改对象值

小程序中获取当前data定义的值&#xff0c;用this.data.xxx setData的时候要修改的值是不需要加this.data.xxx的&#xff0c;直接xxx, 一般直接修改data的值直接修改&#xff0c;修改数组中对象的值或者对象的属性值都要先转为字符串再加中括号&#xff0c;如果有变量可以用E…

mac你没有权限打开应用程序_如何管理Mac的隐私权限控制

在使用MAC电脑清理软件的时候&#xff0c;经常会出现需要权限问题&#xff0c;在没有权限的情况下&#xff0c;我们不能对一些文件进行更改和删除&#xff0c;那么该如何管理Mac的隐私权限控制呢&#xff1f;下面的文章就来告诉大家该如何设置隐身权限问题。第一步&#xff1a;…

Linux网卡绑定

很多情况下我们都需要用到网卡绑定这中情况&#xff0c;例如&#xff1a;大数据传输备份、网卡冗余。使用网卡绑定可以提高网络的传输速度&#xff0c;并且还能保证网络安全性&#xff0c;做到网卡的高可用&#xff0c;甚至可以节省IP地址。 网卡绑定模式 mode0&#xff1a;轮询…

c# 中通快递对接_快递共配是什么?行业前景怎么样?

首先了解快递共配是什么&#xff0c;随着快递市场竞争的加剧&#xff0c;降本增效成为快递网点越来越重视的方面&#xff0c;末端整合就成为快递网点普遍关注的一个焦点&#xff0c;即大家通常所说的共配。如何提升快递末端效率&#xff0c;一直都是快递企业比较关心的话题。不…

html中input字体加粗,更改checkboxGroupInput标签的字体标记(即粗体,斜体)

我正在用R中的Shiny创建一个Web应用程序。我有一个我在地图上绘制的数据集。使用checkboxGroupInput小部件&#xff0c;用户可以选择他们想要在地图上看到的类别(或不)。但是&#xff0c;数据集会随着时间而改变&#xff0c;并非所有类别都可用。为了清楚哪些在当前集合中可用&…

cglib:缺少的手册

字节码检测库cglib是许多众所周知的Java框架&#xff08;例如Hibernate &#xff08;现在不再 &#xff09;&#xff09;或Spring最受欢迎的选择&#xff0c;它们可以完成肮脏的工作。 字节码检测允许在Java应用程序的编译阶段之后操作或创建类。 由于Java类在运行时动态链接&a…

(7)MySQL的事务

什么是事物&#xff1a; 作用&#xff1a;一个事务&#xff08;transaction&#xff09;中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#xff0c;不会结束在中间某个环节。事务在执行过程中发生错误&#xff0c;会被回滚&#xff08;Rollback&#xff09;…

vue路由跳转报错解决

vue路由跳转&#xff1a; setTimeout(function () { console.log(this); this.$router.push("/login"); },800) 语法没问题但是报错&#xff1a; MyFollow.vue?c93c:119 Uncaught TypeError: Cannot read property push of undefined 这时候说明this指向不一样了&am…

ceph存储原理_热门的分布式存储系统ceph入门介绍

一、什么是cephceph是当前最热门的分布式存储系统之一&#xff0c;是软件定义存储(SDS,SoftwareDefinedStorage)解决方案中的典范。其具备良好的可靠性、可扩展性&#xff0c;应用范围包括块存储(RBD,RadosBlockDevice)、文件存储(CephFS,CephFileSystem)和对象存储(RADOSGW,Re…

2017计算机应用考研大纲,2017考研计算机大纲

出国留学考研网为大家提供2017年考研计算机大纲&#xff1a;数据结构&#xff0c;更多考研资讯请关注我们网站的更新!2017年考研计算机大纲&#xff1a;数据结构一、数据结构考查目标1. 掌握数据结构的基本概念、基本原理和基本方法。2. 掌握数据的逻辑结构、存储结构及其基本操…

[SCOI2009] windy数

[SCOI2009] windy数 题目大意:求\([L,R]\)中相邻每一位之差至少大于\(2\)的数字个数,(只有一位也算) Solution 数位\(dp\)直接搞,对于前导零,其实不用卡下界,只要一个用一个状态来表示就好,还可以取\(0\) Code #include <iostream> #include <cstdio> #include <…

小程序点击调转带参数_带你走遍苏大的每个角落,校园导览小程序上线!

精彩推荐 1. 招新 | 携手趁韶华&#xff0c;约你同做“校媒人”&#xff01;2. 迎新现场 | 今天&#xff0c;“小20”是苏大的主角3. 苏州大学与亨通集团签订战略合作协议钟楼、红楼、精正楼……存菊堂、敬贤堂、子实堂……初至校园的“小20”们是否会有这样的烦恼在这楼宇亭台…