当前位置: 首页 > news >正文

怎么解决 Http 协议无状态?

一、Http 协议无状态的含义

1.1 有状态协议

常见的许多七层协议实际上是有状态的,例如 SMTP 协议,它的第一条消息必须是 HELO,用来握手,在 HELO 发送之前其他任何命令都是不能发送的;接下来一般要进行 AUTH 阶段,用来验证用户名和密码;接下来可以发送邮件数据;最后,通过 QUIT 命令退出。可以看到,在整个传输层上,通信的双方是必须要时刻记住当前连接的状态的,因为不同的状态下能接受的命令是不同的;另外,之前的命令传输的某些数据也必须要记住,可能会对后面的命令产生影响。这种就叫做有状态的协议。

1.2 为什么说 http 协议是无状态协议

相反,为什么说 HTTP 是无状态的协议呢?因为它的每个请求都是完全独立的,每个请求包含了处理这个请求所需的完整的数据,发送请求不涉及到状态变更。即使在 HTTP/1.1 上,同一个连接允许传输多个 HTTP 请求的情况下,如果第一个请求出错了,后面的请求一般也能够继续处理(当然,如果导致协议解析失败、消息分片错误之类的自然是要除外的)。可以看出,这种协议的结构是要比有状态的协议更简单的,一般来说实现起来也更简单,不需要使用状态机,一个循环就行了。

1.3 为什么不改进 http 协议使之有状态

最初的 http 协议只是用来浏览静态文件的,无状态协议已经足够,这样实现的负担也很轻(相对来说,实现有状态的代价是很高的,要维护状态,根据状态来操作。)。随着 web 的发展,它需要变得有状态,但是不是就要修改 http 协议使之有状态呢?是不需要的。因为我们经常长时间逗留在某一个网页,然后才进入到另一个网页,如果在这两个页面之间维持状态,代价是很高的。其次,历史让 http 无状态,但是现在对 http 提出了新的要求,按照软件领域的通常做法是,保留历史经验,在 http 协议上再加上一层实现我们的目的(“再加上一层,你可以做任何事”)。所以引入了其他机制来实现这种有状态的连接。

1.4 无状态协议的优缺点

和许多人想象的不同,会话(Session)支持其实并不是一个缺点,反而是无状态协议的优点,因为对于有状态协议来说,如果将会话状态与连接绑定在一起,那么如果连接意外断开,整个会话就会丢失,重新连接之后一般需要从头开始(当然这也可以通过吸收无状态协议的某些特点进行改进);而 HTTP 这样的无状态协议,使用元数据(如 Cookies 头)来维护会话,使得会话与连接本身独立起来,这样即使连接断开了,会话状态也不会受到严重伤害,保持会话也不需要保持连接本身。另外,无状态的优点还在于对中间件友好,中间件无需完全理解通信双方的交互过程,只需要能正确分片消息即可,而且中间件可以很方便地将消息在不同的连接上传输而不影响正确性,这就方便了负载均衡等组件的设计。

无状态协议的主要缺点在于,单个请求需要的所有信息都必须要包含在请求中一次发送到服务端,这导致单个消息的结构需要比较复杂,必须能够支持大量元数据,因此 HTTP 消息的解析要比其他许多协议都要复杂得多。同时,这也导致了相同的数据在多个请求上往往需要反复传输,例如同一个连接上的每个请求都需要传输 Host、Authentication、Cookies、Server 等往往是完全重复的元数据,一定程度上降低了协议的效率。

1.5 HTTP 协议是无状态协议,这句话本身到底对不对?

实际上,并不全对。HTTP/1.1 中有一个 Expect: 100-Continue 的功能,它是这么工作的:

  1. 在发送大量数据的时候,考虑到服务端有可能直接拒收数据,客户端发出请求头并附带 Expect: 100-Continue 的 HTTP 头,不发送请求体,先等待服务器响应
  2. 服务器收到 Expect: 100-Continue 的请求,如果允许上传,发送 100 Continue 的 HTTP 响应(同一个请求可以有任意个 1xx 的响应,均不是最后的 Response,只起到提示性作用);如果不允许,例如不允许上传数据,或者数据大小超出限制,直接返回 4xx/5xx 的错误
  3. 客户端收到 100 Continue 的响应之后,继续上传数据

可以看出,这实际上很明显是一个有状态协议的套路,它需要先进行一次握手,然后再真正发送数据。不过,HTTP 协议也规定,如果服务端不进行 100 Continue 的响应,建议客户端在等待较短的时间之后仍然上传数据,以达成与不支持 Expect: 100-Continue 功能的服务器的兼容,这样可以算是“能有状态则有状态,否则回到无状态的路上”,这样说 HTTP 1.x 是无状态的协议也是没错的。

至于 HTTP/2,它应该算是一个有状态的协议了(有握手和 GOAWAY 消息,有类似于 TCP 的流控),所以以后说“HTTP 是无状态的协议”就不太对了,最好说“HTTP 1.x 是无状态的协议”

二、如何解决无状态问题

HTTP 协议是无状态的,无状态意味着,服务器无法给不同的客户端响应不同的信息。这样一些交互业务就无法支撑了。Cookie 应运而生。

2.1 Cookie

cookie 的传递会经过下边这 4 步:

  1. Client 发送 HTTP 请求给 Server
  2. Server 响应,并附带 Set-Cookie 的头部信息
  3. Client 保存 Cookie,之后请求 Server 会附带 Cookie 的头部信息
  4. Server 从 Cookie 知道 Client 是谁了,返回相应的响应

Cookie 的英文翻译是甜品,使用 Cookie 可以自动填写用户名、记住密码等,是给用户的一点甜头。

Server 拿到 Cookie 后,通过什么信息才能判断是哪个 Client 呢?服务器的 SessionID。

2.2 Session

如果把用户名、密码等重要隐私都存到客户端的 Cookie 中,还是有泄密风险。为了更安全,把机密信息保存到服务器上,这就是 Session。Session 是服务器上维护的客户档案,可以理解为服务器端数据库中有一张 user 表,里面存放了客户端的用户信息。SessionID 就是这张表的主键 ID。

Session 信息存到服务器,必然占用内存。用户多了以后,开销必然增大。为了提高效率,需要做分布式,做负载均衡。因为认证的信息保存在内存中,用户访问哪台服务器,下次还得访问相同这台服务器才能拿到授权信息,这就限制了负载均衡的能力。而且 SeesionID 存在 Cookie,还是有暴露的风险,比如 CSRF(Cross-Site Request Forgery,跨站请求伪造)。

如何解决这些问题呢?基于 Token 令牌鉴权。

2.3 Token

首先,Token 不需要再存储用户信息,节约了内存。其次,由于不存储信息,客户端访问不同的服务器也能进行鉴权,增强了扩展能力。然后,Token 可以采用不同的加密方式进行签名,提高了安全性。

Token 就是一段字符串,Token 传递的过程跟 Cookie 类似,只是传递对象变成了 Token。用户使用用户名、密码请求服务器后,服务器就生成 Token,在响应中返给客户端,客户端再次请求时附带上 Token,服务器就用这个 Token 进行认证鉴权。

Token 虽然很好的解决了 Session 的问题,但仍然不够完美。服务器在认证 Token 的时候,仍然需要去数据库查询认证信息做校验。为了不查库,直接认证,JWT 出现了。

2.4 JWT

JWT 的英文全称是 JSON Web Token。JWT 把所有信息都存在自己身上了,包括用户名密码、加密信息等,且以 JSON 对象存储的。

JWT 长相是 xxxxx.yyyyy.zzzzz,极具艺术感。包括三部分内容

  • Header 包括 token 类型和加密算法(HMAC SHA256 RSA)
{  "alg": "HS256",  "typ": "JWT"}
  • Payload

传入内容

{  "sub": "1234567890",  "name": "John Doe",  "admin": true}
  • Signature

签名,把 header 和 payload 用 base64 编码后"."拼接,加盐 secret(服务器私钥)。

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret);

最终的 token 就是这样一个字符串

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.yKOB4jkGWu7twu8Ts9zju01E10_CPedLJkoJFCan5J4;

给 Token 穿个外套

这就是我们在请求 Header 里面看到的内容格式了。

相关文章:

怎么解决 Http 协议无状态?

一、Http 协议无状态的含义 1.1 有状态协议 常见的许多七层协议实际上是有状态的,例如 SMTP 协议,它的第一条消息必须是 HELO,用来握手,在 HELO 发送之前其他任何命令都是不能发送的;接下来一般要进行 AUTH 阶段&#…...

FlinkCDC for mysql to Clickhouse

完整依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.flink/flink-core --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-core</artifactId><version>1.13.0</version>…...

沃通SSL证书服务多省区一体化政务服务平台

近年来&#xff0c;我国政务服务数字化水平不断提升&#xff0c;数字政府建设取得积极成效。依托全国一体化政务服务平台&#xff0c;政务服务效能不断提升&#xff0c;“一网通办”能力显著增强&#xff0c;为创新政府治理、优化营商环境提供了有力支撑。沃通SSL证书具备保护数…...

Linux程序地址

目录 一、定义 二、问题引出 三、虚拟地址和物理地址 &#xff08;一&#xff09;问题解释 &#xff08;二&#xff09;什么是进程地址空间 &#xff08;三&#xff09;为什么要有进程地址空间 一、定义 #include <stdio.h> #include <stdlib.h>//geten…...

华为OD k 对元素最小值(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

解决Unity打包时,Android SDK 报错问题

报错内容应该包括类似如下信息&#xff1a; CommandInvokationFailure: Failed to update Android SDK package list. java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtim…...

基于nodejs+vue 校园通勤车系统

但是管理好校园通勤车可视化又面临很多麻烦需要解决, 信息化已经成为主流,开发一个校园通勤车可视化系统小程序一方面的可能会更合乎时宜,困扰管理层的许多问题当中,校园通勤车 管理也是不敢忽视的一块。另一方面来说也可以提高在校园通勤车可视化管理方面的效率给相关管理人员…...

【JavaEE】Java多线程编程案例 -- 多线程篇(3)

Java多线程编程案例 1. 单例模式1.1 代码的简单实现1.2 懒汉模式的线程安全代码 2. 阻塞队列2.1 阻塞队列的概念2.2 使用库中的BlockingDeque2.3 模拟实现阻塞队列2.4 生产者消费者模型 3. 定时器3.1 概念3.2 使用库的定时器 - Timer类3.3 模拟实现定时器 4. 线程池4.1 概念4.2…...

axios发送常见请求方式以及拦截器的封装

一&#xff0c;常见请求 //1.get--传递paramsaxios.get("/test",{params:{}})//2.post--传递paramsaxios.post("/test",{},{params:{}}) //3.post--传递bodyaxios.post("/test",{name:""}) 二&#xff0c;封装请求拦截器 import ax…...

Apollo中的身份验证与授权:保护你的数据

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

斜率优化dp

f i min ⁡ ( a j − j i ) f_i\min(a_j - j \times i) fi​min(aj​−ji) 考虑变成点对 ( j , a j ) (j,a_j) (j,aj​)&#xff0c;则 f i Y j − X j i f_iY_j-X_ji fi​Yj​−Xj​i 令 i k , f i b ik, f_ib ik,fi​b&#xff0c;得 b Y j − X j k bY_j-X_jk b…...

华为OD 打印任务排序(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

最新Ai写作创作系统源码+Ai绘画系统源码+搭建部署教程+支持GPT4.0+支持Prompt预设应用+思维导图生成

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…...

FPGA【紫光语法】

寄存器数据类型&#xff1a; reg 默认为 1 bit wide&#xff0c;如果超过 1 bit&#xff0c;则需要 range declaration 设置 reg 的位宽integer 默认位宽为 32 bit&#xff0c;不允许有 range declarationtime 默认位宽为 64 bit&#xff0c;不允许有 range declarat…...

运维监控Zabbix部署

目录 运维监控Zabbix部署 1. 简介 2. 安装 ​编辑 2.1 安装前准备 - Mysql 2.2 安装Zabbix Server 和 Zabbix Agent 2.2.1 安装Zabbix yum库 2.2.2 安装Zabbix Server、前端、Agent 2.2.3 初始化Mysql数据库 2.2.4 为Zabbix Server配置数据库 2.2.5 配置Zab…...

vue与react,angular的区别

Vue.js 作为一个优秀的前端框架&#xff0c;方便前端开发者快速开发应用的前端&#xff0c;在实际项目中使用得比较普遍。 当然 Vue.js 也不是实际项目中唯一的前端框架&#xff0c;比较优秀的前端框架还有 React、AngularJS 和 Angular等。接下来就介绍一下 Vue.js 同这3个框架…...

水质分析仪MQTT应用案例

水质分析仪MQTT应用案例 一、公司介绍 某仪器股份有限公司&#xff0c;集研发&#xff0c;生产&#xff0c;销售于一体的水质分析仪器公司。产品主要包括PH/ORP分析仪&#xff0c;电导度分析仪&#xff0c;溶氧分析仪&#xff0c;离子浓度分析仪&#xff0c;浊度分析仪及重金…...

网络代理技术的护航与网络安全

在数字化时代&#xff0c;网络代理技术日益重要&#xff0c;不仅可维护网络安全&#xff0c;还能促进数据获取。本文深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫、HTTP协议中的应用&#xff0c;助您深刻了解这些技术。 1. Socks5代理&#xff1a;网络安全与多协议支持…...

大模型LLM相关面试题整理-PEFT

Prefix/Prompt-Tuning&#xff1a;在模型的输入或隐层添加 个额外可训练的前缀 tokens&#xff08;这些前缀是连续的伪 tokens&#xff0c;不对应真实的 tokens&#xff09;&#xff0c;只训练这些前缀参数&#xff1b; Adapter-Tuning&#xff1a;将较小的神经网络层或模块插入…...

65_Pandas显示设置(小数位数、有效数字、最大行/列数等)

65_Pandas显示设置&#xff08;小数位数、有效数字、最大行/列数等&#xff09; 本文介绍了使用 print() 函数显示 pandas.DataFrame、pandas.Series 等时如何更改设置&#xff08;小数点后位数、有效数字、最大行/列数等&#xff09;。 有关如何检查、更改和重置设置值的详细…...

通义千问1.8B-GPTQ-Int4效果实测:中文问答、代码生成、多轮对话精彩案例集

通义千问1.8B-GPTQ-Int4效果实测&#xff1a;中文问答、代码生成、多轮对话精彩案例集 1. 模型简介与部署验证 通义千问1.5-1.8B-Chat-GPTQ-Int4是一个经过量化优化的轻量级语言模型&#xff0c;专门针对中文场景进行了深度优化。这个模型基于Transformer架构&#xff0c;采用…...

从图表图像中提取数据:5个步骤告别手动描点烦恼

从图表图像中提取数据&#xff1a;5个步骤告别手动描点烦恼 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 还在为从科研论文图表中手动…...

拒绝碎片化学习!深度拆解网安底层原理,附完整进阶路线,零基础自学必备宝典

拒绝碎片化学习&#xff01;深度拆解网安底层原理&#xff0c;附完整进阶路线&#xff0c;零基础自学必备宝典 随着数字化转型的全面推进&#xff0c;网络安全已从“可选配”变为“必需品”&#xff0c;小到个人账号安全&#xff0c;大到国家关键信息基础设施防护&#xff0c;…...

如何用罗技鼠标宏实现PUBG零后坐力射击?终极配置指南

如何用罗技鼠标宏实现PUBG零后坐力射击&#xff1f;终极配置指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中难以控制的…...

如何高效地阅读技术文档?

如何高效地阅读技术文档&#xff1f; 技术文档是开发者日常工作中不可或缺的资源&#xff0c;但面对冗长复杂的文档&#xff0c;许多人常常感到无从下手。高效阅读技术文档不仅能节省时间&#xff0c;还能快速解决问题。那么&#xff0c;如何提升阅读效率呢&#xff1f;以下从…...

为什么92%的量化研究员在VSCode里漏掉关键异常堆栈?——金融时间序列调试中的4层隐式上下文缺失分析

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么92%的量化研究员在VSCode里漏掉关键异常堆栈&#xff1f;——金融时间序列调试中的4层隐式上下文缺失分析 被忽略的异常传播链 当使用 pandas.DataFrame.resample(5T).ohlc() 处理高频tick数据时…...

监控仪表板:实时数据可视化与交互式探索

监控仪表板&#xff1a;实时数据可视化与交互式探索 在当今数据驱动的时代&#xff0c;企业需要快速获取、分析并响应海量数据。监控仪表板作为一种高效的数据展示工具&#xff0c;能够将复杂的数据转化为直观的可视化图表&#xff0c;帮助用户实时掌握业务动态。无论是生产线…...

第 9 集:GitHub Actions 基础:让 CI 成为 AI 协作的质量闸门

为什么 CI 很重要? 持续集成(CI)是软件开发中的关键实践,它通过自动化流程确保代码更改的质量和稳定性。AI 生成的代码可能表面上看起来正确(例如语法无误),但往往隐藏着潜在问题,如逻辑错误、兼容性问题或回归缺陷。CI 系统(如 GitHub Actions)自动执行一系列检查,…...

深入解析Claude Code:AI编程助手架构、工具系统与安全实践

1. 项目概述与核心价值最近在深入研究AI编程助手领域&#xff0c;特别是那些能够真正理解代码上下文、执行复杂任务并自主学习的智能体&#xff08;Agent&#xff09;。在这个过程中&#xff0c;我系统性地拆解和分析了当前市面上一个极具代表性的项目——Claude Code。这不仅仅…...

量子启发KAN-LSTM:时序建模新架构解析

1. 量子启发的KAN-LSTM架构解析在时序建模领域&#xff0c;传统LSTM网络虽然表现出色&#xff0c;但其参数冗余和表达能力受限的问题一直困扰着从业者。我们团队提出的QKAN-LSTM架构&#xff0c;通过量子力学原理与传统深度学习的创新融合&#xff0c;为解决这些问题提供了全新…...