当前位置: 首页 > Web前端 > HTML

如何在Http请求中维护状态?

时间:2023-04-02 23:02:24 HTML

这是无数程序员都被触动过的问题,但只有少数人明白其中的道理。大致搜索了一下,网上还是有一些文章误导大家维护http协议的状态。例如:有人说使用ViewState是asp.net特有的东西。请具体说明“如何在asp.net下保持状态”!!关于用户认证方案,可以查看之前的文章:程序员的通行证——cookie和session的关系其实很简单和我们这个年代相比,http协议是一个比较古老的协议。它的诞生是为了让人们在互联网领域自由冲浪。在现代,http协议已经成为分布式网络的基础之一。从最初的1.0版本到现在的2.0乃至正在开发的3.0,在分布式通信领域的地位越来越重要。不管是什么http协议的文章,都需要笼统的讲一下http。这里简单说几句。http协议在报文的编码方式上使用文本,在通信中从客户端到服务器端使用请求-响应的方式。http协议是基于tcp协议的应用层协议,所以它的传输速度势必会受到tcp协议的限制。有人说在http协议中使用text协议是大错特错。我不这么认为。首先,http协议发明的时候,可供选择的并不多。在那个时候,文本协议已经是更好的选择了。.其次,除了文本协议的传输性能比二进制方式差之外,其他都不错,尤其是在数据的直观性方面,更便于我们理解。尤其是程序员,在看到http请求和返回的文本内容的时候,可以大致猜出很多东西。在我看来,http最大的缺陷在于交互的设计。也就是说,维护http的状态问题是我们日常开发中面临的最大问题。HTTP本质上是无状态的,但这并不意味着它无法解析。我们为什么要保持状态?根本原因在于当前互联网的交互需求。什么是保持状态?通俗地说,对于客户端发起的http请求,服务端需要知道它来自于哪个客户端。想象一下,如果没有状态,你在淘宝购物下单,服务器怎么知道你下单了?你把你的单子送给别人,你是不是要骂你妈?说到http维护状态,不得不声明http和浏览器是有区别的。浏览器只是使用http协议进行通信。很多同学在提到http协议的时候,都会拿浏览器来举例。这是一个不完善的http协议。如果要保持状态,无非就是使用http协议本身定义的属性。比如:Header、Body……只要服务端能识别,理论上都可以作为凭证参数来维护状态。保持http状态最简单粗暴的方法就是直接使用参数。服务端通过http协议将参数凭证发送给客户端。不管客户端存放在哪里,只要下次请求携带这个参数,服务端就可以按照约定读取相应的参数进行识别。这种方式目前多用于保留非敏感信息,比如最常见的分页参数https://www.cnblogs.com/#p2有人有问题吗?分页参数也算作状态吗?虽然大多数文章中提到的状态都是指用户的登录状态,但是从状态的抽象定义来看,分页也是一种状态的定义。出于隐私考虑,用户身份状态的维护一般不会通过url参数的方式来维护。Cookie保持状态Cookie是http请求头中的一个属性,保存在客户端。在很多文章中都说cookie是由服务器发送给客户端的。你这样说不好吗?Cookie本质上是客户端的东西。客户端不能自己创建cookie吗?客户当然可以自己创建cookie!!只是在用户认证的过程中,标识用户身份的cookie是由服务器下发的,所以在介绍cookie本身的定义时请不要误导他人。使用cookies来维护http状态是现在非常普遍的解决方案,其中一个原因是:在浏览器没有跨域的情况下,浏览器会自动在http请求中携带cookies,非常方便。在非浏览器环境下,您可能需要编写代码来确保每次都携带相应的cookie。服务端收到http请求后,解析对应的cookie,得到需要保留的状态标识。说到服务端,很多人提到session会保持HTTP状态。这不好吗?首先,会话本质上是一个抽象的概念。其次,我们平时说的session,比如用户信息,属于服务器的kv。数据,不同的client可以识别不同的session,本质上都是通过cookie机制实现的。我觉得说session可以保持http状态的人说的不是很清楚。还要别的吗?除了以上两种方式,还有没有其他方式可以保持HTTP请求状态呢?当然有!!http状态的维护需要客户端和服务端同时配合。如果客户端上传了一个cookie,但是服务端不能正常解析,这不算状态维护。理论上只要服务端能够识别出http请求中携带的一些数据,就可以达到维护状态的目的。在浏览器中,受限于各个浏览器的功能,当浏览器发送http请求时,只会自动携带指定的header和body数据,而大多数header只能携带协议规定的那些固定值。在服务器中保持http状态的方案很少的原因之一。body一般用在posthttp请求中,应用场景有限。http的header有很多属性,有兴趣的同学可以研究一下。这里提到了一个“授权”。从字面意思就可以知道是和认证相关的。当我们想在http请求中保留用户的登录状态时,可以使用该字段。是否可以保留其他状态?当然header中的值本质上是服务端的kv数据,各个业务可以灵活控制这些数据用来干什么。例如:通常,“Authorization”header用于用户身份验证,那么我可以用它来识别页面A或页面B吗?当然,只要客户端在不同的页面上传不同的“Authorization”值,那么服务端能识别这些值就足够了。从来没有人说过http协议只能用于客户端和服务器。服务器与服务器通信也可以使用http协议,现在很多分布式系统都是采用这种方式进行通信。至于服务器与服务器之间的通信,保持http协议的状态更灵活(这个相对于浏览器而言)。请求者和接收者可以约定任意一个header来标识状态,这也得益于http协议headerheader可以自定义的特性。例如:如果你喜欢“XXOO”,你可以使用“XXOO”的header来标识状态Accept:application/jsonAccept-Encoding:gzip,deflate,brAccept-Language:...XXOO:10times/dayWriteeach问题在最后解决方案有很多种,没有完美的方案,只有最适合业务场景的方案。认清技术的本质,是我们提升技能的捷径。能力有限,技术无限,欢迎批评指正!更多精彩文章分布式并发系列架构设计系列趣味学习算法与数据结构系列设计模式系列