程序员过关斩将--Http请求中如何保持状态?

微信搜一搜

架构师修行之路

这是一个被无数程序员撸过的问题,却只有少数人了解了真相。大体上搜了一下,网上关于http协议保持状态误导大家的文章还是有的,比如:有人说利用ViewState,那是asp.net下独有的东西,请注明“asp.net下如何保持状态”!!

关于用户认证方案可以查看以前的文章:

程序员过关斩将--cookie和session的关系其实很简单

程序员过关斩将--互联网人必备知识cookie和session认证

程序员过关斩将--更加优雅的Token认证方式JWT

01

PART

Http协议

http协议相对我们的年龄来说,是一个比较古老的协议,它的诞生之初是为了能让人们在互联网的领域自由冲浪。到了现代,http协议不谦虚的讲,已经成为了分布式网络的基础之一,从最初的1.0版本到现在的2.0乃至研发中的3.0,它在分布式通信领域已经越来越重要。

无论http协议什么样的文章,都需要把http大体说上一下,这里就简单啰嗦几句

http协议在报文的编码方式上采用了文本方式,通信上采用客户端到服务器的请求-响应方式。

http协议是基于tcp协议之上的应用层协议,所以它的传输速度注定会收到tcp协议的约束。有人说http协议采用文本协议是一个天大的错误,我不这么认为,首先在http协议被发明之初,可供的选择并不多,在当时看来,文本协议已经是比较好的选择了。其次,文本协议除了在传输性能上比二进制方式差一些,其他都还好,尤其是在数据的直观性上,很容易被我们理解。尤其是程序员,在看到http的请求和返回文本内容的时候,就可以大体猜出很多东西。

在我看来,http最大的缺陷在于交互中的设计,换句话说,http的状态保持问题,才是在我们平时开发中面临的最大问题。http天生是无状态的,但这并不意味着不能解决。

为什么我们要保持状态呢?根本原因在于现在的互联网的交互需求。什么是保持状态呢?通俗来讲,客户端发起的http请求,服务端需要知道来自于哪个客户端。设想,如果没有状态,当你逛淘宝的时候,剁手下了单,服务器怎么知道是你下的单呢?如果把你的单发给别人,你是不是要去骂娘了呢?

说到http保持状态,我有一点要声明,http和浏览器是有区别的,浏览器只不过是利用http协议来进行通信,有不少同学一提到http协议,就以浏览器来举例,这个是不健全的

http协议要想保持状态,无非就是利用http协议本身定义的那些属性来实现。比如:Header,Body ......只要服务器能识别,理论上就可以作为保持状态的凭据

02

PART

参数保持状态

http保持状态最简单并且最粗暴的莫过于直接采用参数了。服务器把参数凭据通过http协议下发给客户端,客户端无论存储到哪,只要下次请求把这个参数携带上,服务器就可以根据约定读取相应的参数来进行识别。

这种方式目前大多数用来保持那些非敏感信息,比如最常见的分页参数

https://www.cnblogs.com/#p2

有人会有疑问?分页参数也算是状态吗?虽然大多数的文章中所说的状态是指用户的登录状态,但是从状态的抽象定义上来看,分页也算是一种状态的定义。而用户身份状态的保持,由于涉及到隐私,一般不会采用url参数的方式来维持。

03

PART

Cookie保持状态

Cookie是http请求中header中的一个属性,它保存在客户端。

很多文章里,都说Cookie是服务端下发给客户端的,你们这样说是不是不太好?Cookie本质是上客户端的东西,客户端不能自己创建Cookie吗?客户端当然可以自己创建Cookie!!只不过在用户进行认证的流程中,标识用户身份的cookie是服务器下发的,所以在介绍Cookie本身定义的时候请不要误导别人。

利用Cookie来保持http的状态是现在很常见的解决方案,其中的一个原因是:在浏览器中没有跨域的情况下,浏览器会在http请求中自动携带cookie,非常方便。在非浏览器环境中,可能需要写代码来保证每次都携带对应的cookie。

服务端在接收到http请求,解析对应的cookie即可得到需要保持的状态标识。说到服务端,不少人提到了session会保持http状态,这是不是又不太好了,首先session本质上是一个抽象的概念,其次我们平时所说的用户信息等session是属于服务端的kv数据,不同的客户端可以识别不同的session本质上也是通过cookie机制来实现,我认为那些说session可以保持http状态的说法是不明确的。

04

PART

还有其他吗?

除了以上两种方式还有其他方式可以保持http的请求状态吗?当然有!!

http状态的保持需要客户端和服务端同时协作来保证,如果客户端上传了cookie,但是服务端不能正常解析,这也算不上状态的保持。理论上服务端只要能识别http请求中携带的某些数据,就能达到保持状态的目的。

在浏览器中,受限于每个浏览器的功能,浏览器发送一个http请求,自动携带的只有规定的那些header和body数据,而多数header只能携带协议规定的那些固定值,这也是浏览器中要想保持http状态方案少的原因之一。body一般用在post的http请求中,所以它的应用场景是有限的。

关于http的header的属性有很多,有兴趣的同学可以去研究一下。这里提及一个“Authorization”,从字面意思就可以知道它和认证相关,当我们要保持http请求中用户的登录状态时候可以用此字段。那保持其他状态是否可以用呢?当然可以,header中的那些值本质上对于服务端来说就是kv数据,这些数据用于什么用途,每个业务都可以灵活控制。比如:通常情况下,“Authorization”这个header用于用户认证,那我可不可以用于识别是A页面还是B页面呢,当然可以,只要客户端在不同的页面上传不同的“Authorization”值,然后服务端去识别这些值就可以了。

从来没有人说过http协议只能用于客户端和服务端。服务端和服务端通信同样能够使用http协议,而且现在很多分布式系统都是这样来通信的。至于服务端和服务端通信,那http协议保持状态就更加灵活了(这里针对浏览器来比较),请求方和接受方可以约定任意的header头来标识状态,这还要得益于http协议header头可以自定义的特性。比如:如果喜欢“XXOO”,完全可以采用“XXOO”的header来标识状态

Accept: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: 
.
.
.
XXOO:10次/天

05

PART

写在最后

每个问题的解决方案有很多,没有完美的方案,只有最适合业务场景的方案。认清技术的本质,才是我们提高自身技能的捷径。能力有限,技术无限,欢迎批评指正!

●程序员修神之路--为什么我会了SOA,你们还要逼我学微服务?

●程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁

●程序员修神之路--设计一套RPC框架并非易事

●程序员过关斩将--要想获取我的用户信息,就得按照规矩来

●程序员过关斩将--更加优雅的Token认证方式JWT

●程序员过关斩将--cookie和session的关系其实很简单

●程序员修神之路--用NOSql给高并发系统加速

●程序员修神之路--高并发系统设计负载均衡架构

●程序员过关斩将--你为什么还在用存储过程?

●程序员修神之路--问世间异步为何物?

●程序员修神之路--提高网站的吞吐

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

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

相关文章

7-3 作业调度算法--高响应比优先 (40 分)(思路+详解+vector容器做法)Come Baby!!!!!

一:题目 输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照高响应比优先算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数)。…

基于C#开发的浏览器隐身工具-上班别乱开

魔鱼斯拉鹏_隐身高速浏览器是首款基于新款Chromium打造的超轻量“隐身”浏览器。采用时下流行的车机交互系统,主打“小透明”隐身访问功能,有了他你就可以(上班)肆意的开车遨游互联网了。测一测你的版本:https://liula…

vector容器中关于处理从非0位置开始赋值的操作

一:前言 问题描述:我们想从下标非0的位置开始赋值, 那么我们需要两步骤:1.确定开启的vector容器的范围(eg: vector v(1000)) 2.在赋值的时候,不可以用push_back()了,直接用(v[i] values&…

html标签属性%= %,HTML标签属性集合

HTML标签属性集合更新时间:2017/2/8 10:28:00 浏览量:594 手机版图象热点映射范围锚,为文档定义连接首字母缩写词地址块引用放大字体为文档中的其他锚定义基本URL取代dir设置换行粗体在表单中创建一个按钮元素程序代码片段对某个文献引用定…

435. 无重叠区间(贪心经典题+思路+详解)

一:题目: 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2],…

UEFI + GPT 启动 VHD

说明 周五,笔记本充不进电了,还好我的系统是做到 VHD 中的,把硬盘拿出来,插到其它机器上,从我的硬盘启动就可以了(虽然当时没有从我的系统启动,因为只需要等待一天,周末就可以去修电…

html列表变成三个一行,HTML列表仅限第一行缩进

将文本包装到项目符号右侧的原因是浏览器将整个list-item元素呈现在项目符号的右侧。它将始终将文本包装在包含文本的元素中。最简单的解决方案是不使用内置列表项目项目符号。取而代之的是创建一个你喜欢的子弹的图像并使用float:left将它放在左上角。文本将围绕它…

vector容器中重写sort方法

一:问题描述 1: 我们常用的vector中sort方法是升序的但我们可以通过重新定义sort方法即可实现其的降序处理,以前总是在结构体数组当中用到过重写sort方法,但其实在vector当中也是可以用的 2: 我们在调用的时候注意…

基于Prometheus和Grafana打造业务监控看板

前言 业务监控对许许多多的场景都是十分有意义,业务监控看板可以让我们比较直观的看到当前业务的实时情况,然后运营人员可以根据这些情况及时对业务进行调整操作,避免业务出现大问题。老黄曾经遇到过一次比较尴尬的“事故”。其中一条业务线&…

广西高考成绩查询2021,2021年广西高考个人排名怎么查询,广西高考成绩排名查询方法...

高考成绩公布后,很多家长和学生咨询我们,广西高考个人成绩排名位次如何查询:广西高考成绩排名,可以通过省招生考试院发布的广西一分一段表来查询,也可以到聚志愿网站直接输入分数查询,一分一段它显示每一个…

452. 用最少数量的箭引爆气球(贪心算法+思路+详解)07

一:题目 在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。…

10-1 5-1 查询销售便携式电脑但不销售PC的厂商 (20 分)(分析+详解)

一:题目 本题目要求编写SQL语句, 查询销售便携式电脑但不销售PC的厂商。 提示:请使用SELECT语句作答。 表结构: CREATE TABLE product ( maker CHAR(20) , --制造商model CHAR(20) NOT NULL, --产品型号type CHAR(20), …

在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入

MongoDB,被归类为NoSQL数据库(其实我更觉得MongoDb是介于关系型数据库和非关系型数据库之间,此外,在我看来在很多场景中MongoDb都可以取代关系型数据库。),是一个以类JSON格式存储数据的面向文档的数据库系…

10-2 5-2 查询至少生产两种不同的计算机(PC或便携式电脑)且机器速度至少为133的厂商 (20 分)(思路加详解+测试用例)

一:题目 本题目要求编写SQL语句, 查询至少生产两种不同型号的计算机(PC或便携式电脑)且机器速度至少为133的厂商,输出结果按照制造商升序排列。 提示: 本题有三种情况: (1) 至少生产两种不同PC的厂商 &a…

ASP.NET Core学习资源汇总

ASP.NET Core入门学习资源汇总篇幅比較長,分为七个部分。(一)认识.NET Core(二)Vistual Studio安装、调试(三)Asp.Net Core入门指南与学习路线(四)入门级实战项目手册、官…

用计算机探索 按一定规律排列,探索规律练习题1

探索规律练习题1、我们平常用的数是十进制数,如26392103610231019100,表示十进制的数要用10个数码(又叫数字):0,1,2,3,4,5,6,7,8,9。在…

简单快速导出word文档

最近,我写公司项目word导出功能,应该只有2小时的工作量,却被硬生生的拉长2天,项目上线到业务正常运行也被拉长到2个星期。为什么如此浪费时间呢?1)公司的项目比较老,采用硬编码模式,…

如何让多端口网站用一个nginx进行反向代理实际场景分析

前段时间公司要整合服务器资源,刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合,断断续续一个月迁移完成大概优化掉了1/3的机器,完成之后遇到了一些问题,比如曾今零零散散部署在生产上一些可视化UI:apollo&…

【Azure Show】|第五期(下)当下最火热的Blazor与App Service, 嘉宾闫晓迪Alan Tsai...

欢迎来到Azure Show!Azure Show欢迎来到Azure Show第五期(下),继上集分享彭爱华和阿法兔两位老师的跨界经验之后,本期我们【MVP面对面】栏目邀请到远在新西兰的微软最有价值专家闫晓迪和大家聊聊新西兰的技术生态,当然…

台式计算机听音乐,配置一台4000元的台式电脑,主要用于日常办公及上网查资料,听音乐,看电影及学习....

满意答案asshnjgs2014.04.02采纳率:44% 等级:9已帮助:861人CPU:Intel 赛扬D341 2.93G(散) CPU适用类型:台式CPU CPU内核:Prescott 主频(MHz):2930MHz 插槽类型:Socket 775 制作工艺(微米):0.09 微米 L2缓存(KB):256KB FSB(MHz)…