JavaWeb学习——HTTP协议
HTTP 协议
什么是 HTTP 协议
HTTP(超文本传输协议,HyperText Transfer Protocol)是用于在客户端(如浏览器)和服务器之间传输超文本(如网页、图片、视频等)的应用层协议。它是现代互联网数据通信的基础,支持从 Web 服务器传输超文本到本地浏览器的传送协议,几乎所有网页和应用都依赖 HTTP 进行交互。
HTTP 工作原理
HTTP 遵循请求-响应模型,客户端(通常是 Web 浏览器)发送一个 HTTP 请求到服务器,服务器处理该请求后返回一个 HTTP 响应给客户端。这个过程可以概括为以下几个步骤:
- 建立连接:客户端与服务器之间通过 TCP/IP 建立连接。在 HTTP/1.1之前,每个请求都需要重新建立连接;而 HTTP/1.1引入了持久连接,允许在一个 TCP 连接上传输多个请求和响应。
- 发送请求消息:客户端向服务器发送请求消息,这通常包括请求行(指定请求方法如 GET、POST 等,请求的 URL 以及 HTTP 版本)、请求头部(提供关于请求的元数据,例如浏览器类型、接受的内容类型等)以及可选的请求体(对于 POST 请求,它包含要发送的数据)。
- 处理请求并发送响应消息:服务器接收到请求后进行处理,并返回一个 HTTP 响应消息给客户端。响应消息包含状态行(显示 HTTP 版本、状态码及描述短语)、响应头部(提供关于响应的元数据,如内容类型、长度等)和响应体(所请求的内容,如HTML文档、图片等)。
- 关闭或保持连接:根据使用的 HTTP 版本和配置,连接可能会被立即关闭或保持打开以供后续请求使用。
HTTP 特点
- 无状态性:HTTP 本身是无状态协议,即每个请求都是独立的,服务器不会保存客户端的状态信息。然而,通过使用 Cookies、Session 等技术可以在一定程度上实现有状态的交互。
- 简单快速:客户端向服务器请求服务时,只需提供请求方法和路径即可,因此 HTTP 协议简单且高效。
- 灵活:HTTP 允许传输任意类型的数据对象,通过 Content-Type 标记来指示数据的类型。
- 安全性:尽管 HTTP 本身并不安全,但可以通过 SSL/TLS 加密升级为 HTTPS,从而确保数据的安全传输。
HTTP 的发展历程
HTTP/0.9
蒂姆伯纳斯李是一位英国计算机科学家,也是万维网的发明者。他在1989年创建了单行 HTTP 协议,它只是返回一个网页,这个协议在1991年被命名为 HTTP/0.9。
HTTP/1.0
1996年,HTTP/1.0 发布。该规范是显著扩大,并且支持三种请求方法:get,head 和 post。
HTTP/1.0 相对于 HTTP/0.9 的改进如下:
- 每个请求都附加了 HTTP 版本。
- 在响应开始时发送状态代码。
- 请求和响应都包含 HTTP 报文头。
- 内容类型能够传输 HTTP 文件以外的文档。
但是,HTTP/1.0 不是官方标准。
HTTP/1.1
HTTP 的第一个标准化版本 HTTP/1.1 (RFC 2068)于1997年初发布,支持七种请求方法:options,get,head,post,put,delete 和 trace。
HTTP/1.1 是 HTTP/1.0 的增强:
- 虚拟主机允许从单个 IP 地址提供多个域。
- 持久连接和流水线连接允许 Web 浏览器通过单个持久连接发送多个请求。
- 缓存支持节省了宽带并使响应速度更快。
HTTP/1.1 在接下来的15年左右非常稳定。
在此期间,出现了 HTTPS(安全超文本传输协议)。它是使用 SSL/TLS 进行安全加密通信的 HTTP 的安全版本。
HTTP/2
由 IETF 在2015年发布,HTTP/2 旨在提高 web 性能,减少延迟,增加安全性,使 web 应用更加快速、高效和可靠。
- 多路复用:HTTP/2 允许同时发送多个请求和响应,而不是像 HTTP/1.1 一样只能一个一个地处理,这样可以减少延迟,提高效率,提高网络吞吐量。
- 二进制传输:HTTP/2 使用二进制协议,与 HTTP/1.1 使用的文本协议不同,二进制协议可以更快地解析,更有效地传输数据,减少了传输过程中的开销和延迟。
- 头部压缩:HTTP/2 使用 HPACK 算法对 HTTP 头部进行压缩,减少了头部传输的数据量,从而减少了网络延迟。
- 服务器推送:HTTP/2 支持服务器推送,允许服务器在客户端请求之前推送资源,以提高性能。
- 改进的安全性:HTTP/2 默认使用 TLS(Transport Layer Security)加密传输数据,提高了安全性。
- 兼容 HTTP/1.1:HTTP/2 可以与 HTTP/1.1 共存,服务器可以同时支持 HTTP/1.1 和 HTTP/2,如果客户端不支持 HTTP/2,服务器可以回退到 HTTP/1.1。
HTTP/3
于2021年5月27日发布,HTTP/3 是一种新的、快速、可靠以及安全的协议,适用于所有形式的设备。HTTP/3 没有使用 TCP,而是使用谷歌在2012年开发的新协议 QUIC。
HTTP/3 是继 HTTP/1.1 和 HTTP/2 之后的第三次重大修订。
HTTP/3 带来了革命性的变化,以提高 web 性能和安全性,设置 HTTP/3 网站需要服务器和浏览器支持。
目前,谷歌云、Cloudflare 和 Fastly 支持 HTTP/3。Chrome、Firefox、Edge、Opera 和一些移动浏览器支持 HTTP/3。
请求和响应报文
报文的格式
主体上分为报文首部和报文主体,中间空行隔开。
报文首部可以继续细分为“行”和“头”。
请求报文
客户端发送给服务端的报文。
请求报文格式
- 请求首行(请求行);GET/POST 资源路径?参数 HTTP/1.1
- 请求头信息(请求头)。
- 空行。
- 请求体;POST请求才有请求体。
浏览器按住F12可以打开浏览器的开发者工具,点击网络就可以查看请求数据包
form 表单发送 get 请求特点
- 由于请求参数在请求首行中已经携带了,所以没有请求体,也没有请求空行。
- 请求参数拼接在 url 地址中,地址栏可见
url?key1=value1&key2=value2
,不安全。 - 参数在地址栏中携带,有大小限制(一般限制为4k),只能携带纯文本。
- get 请求参数只能上传文本数据。
- 没有请求体,所以封装和解析快,效率高,浏览器默认提交的请求都是 get 请求,例如:地址栏输入回车,超链接,表单默认的提交方式等。
查看 get 请求行、请求头、请求体
- 请求行组成部分:
- 请求方式 get
- 访问服务器的资源路径?参数1=值1&参数2=值2……
- 协议/版本,例如:HTTP/1.1
GET /05_web_tomcat/login_success.html?username=admin&password=123456 HTTP/1.1
-
请求头:
Host
:主机虚拟地址。Connection
:控制网络连接,值为keep-alive
时为长连接。Upgrade-Insecure-Requests
:请求协议的自动升级(HTTP 的请求,如果服务器是 HTTPS 的,浏览器会自动将请求协议升级为 HTTPS)。User-Agent
:用户系统信息。Accept
:浏览器支持的文件类型。Referer
:当前页面的上一个页面的路径。Accept-Encoding
:浏览器支持的压缩格式。Accept-Language
:浏览器支持的语言。
-
请求空行
-
请求体
- get 请求数据不放在请求体里。
form 表单发送 post 请求特点
- post 请求有请求体,而 get 请求没有请求体。
- post 请求数据在请求体中携带,请求体数据大小没有限制,可以用来上传所有内容(文件、文本等)。
- 只能使用 post 请求上传文件。
- post 请求报文多路和请求体相关的配置(请求头)。
- 地址栏参数不可见,相对安全。
- post 效率比 get 低。
- post 请求要求将 form 标签的 method 属性设置为 post。
查看 post 请求行、请求头、请求体
-
请求行组成部分:
-
请求方式 post
-
访问服务器的资源路径
-
协议/版本,例如:HTTP/1.1
-
POST /05_web_tomcat/login_success.html HTTP/1.1
- 请求头
- 请求空行
- 请求体
username=admin&password=123456
响应报文
服务端返回给客户端的报文。
响应报文格式
- 响应首行(响应行):协议/版本 状态码 状态码描述。
- 响应头信息(响应头)。
- 空行。
- 响应体。
- 响应行组成部分
- 协议/版本 HTTP/1.1
- 响应状态码
- 状态描述 OK (缺省)
HTTP/1.1 200 OK
- 响应头
Server
:服务器的版本信息。Accept-Ranges
:客户端服务器是否允许范围请求,即客户端可以请求资源的某个部分而不是整个资源,值为bytes
时,表示服务器支持按字节范围请求资源。Content-Type
:响应体数据的类型。Content-Length
:响应体内容的字节数。Date
:响应的时间。Last-Mondified
:提供文档最后修改的时间,可用于验证缓存的有效性。
- 响应体
常见的响应状态码
- 200:请求成功,浏览器会把响应体内容(通常为 html)显示在浏览器中。
- 302:重定向,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头 Location 指定新请求的 url 地址。
- 304:使用了本地缓存。
- 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源。
- 405:请求的方法不允许。
- 500:请求资源找到了,但服务器内部出现了错误。
响应的状态码
HTTP 响应状态码是服务器对客户端请求的响应结果的一种标准化表示,它由三位数字组成,分为五类,每类都有一个共同的起始数字,具体如下:
- 1xx(信息性状态码):指示请求已接收,继续处理。
100 Continue
:表明请求的初始部分已经被接收,客户端应继续发送剩余部分。101 Switching Protocols
:服务器根据客户端的请求切换协议。
- 2xx(成功状态码):表示请求已被成功接收、理解和接受。
200 OK
:标准的成功响应,表明请求成功并且信息包含在响应中。201 Created
:请求成功且服务器创建了新的资源。204 No Content
:请求成功但响应报文中不包含实体的主体部分。
- 3xx(重定向状态码):需要采取进一步操作以完成请求。
301 Moved Permanently
:请求的资源已被永久移动到新位置,并且未来对该资源的任何引用都应该使用本响应返回的URI。302 Found
:与301类似,但是它是临时性的重定向。304 Not Modified
:如果客户端执行了条件 GET 请求且该页面自上次访问以来未被修改,则服务器会返回此状态码。
- 4xx(客户端错误状态码):请求包含语法错误或无法完成请求。
400 Bad Request
:服务器无法理解请求的格式,客户端应当修改请求后再试。401 Unauthorized
:当前请求需要用户验证。403 Forbidden
:服务器理解请求但拒绝执行。404 Not Found
:请求的资源在服务器上不存在。405 Method Not Allowed
:请求方法对指定资源不适用。
- 5xx(服务器错误状态码):服务器遇到错误,无法完成有效请求。
500 Internal Server Error
:服务器遇到了未知情况,阻止了它完成请求。501 Not Implemented
:服务器不具备完成请求的功能。例如,服务器既不识别请求方法也不支持其对应的资源类型。502 Bad Gateway
:作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收到无效响应。503 Service Unavailable
:由于临时维护或者过载,服务器当前无法处理请求。504 Gateway Timeout
:作为网关或代理工作的服务器未能及时从上游服务器获得响应。
每个状态码都提供了关于请求过程中的特定信息,帮助开发人员和系统管理员诊断问题并优化应用性能。理解这些状态码对于有效的 Web 开发至关重要。
相关文章:

JavaWeb学习——HTTP协议
HTTP 协议 什么是 HTTP 协议 HTTP(超文本传输协议,HyperText Transfer Protocol)是用于在客户端(如浏览器)和服务器之间传输超文本(如网页、图片、视频等)的应用层协议。它是现代互联网数据通…...

QP 问题(Quadratic Programming, 二次规划)
QP 问题(Quadratic Programming, 二次规划)是什么? QP(Quadratic Programming,二次规划)是一类优化问题,其中目标函数是二次型函数,约束条件可以是线性等式或不等式。 QP 问题是线…...

VSTO(C#)Excel开发2:Excel对象模型和基本操作
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

MySQL索引数据结构
目录 1 索引常用的数据结构 1.1 二叉树 1.2 平衡二叉树 1.3 红黑树 1.3 Hash表 1.4 B树 1.4 B树 2 MySQL索引的数据结构 2.1 MyISAM存储引擎索引 2.2 InnoDB存储引擎索引 2.2.1 聚集索引 2.2.2 非聚集索引 2.2.3 联合索引数 2.2.4 hash索引 1 索引常用的数据结构 1.1 二叉树 二…...

C 语 言 --- 数 组 (1)
C 语 言 --- 数 组1 数 组定义一维数组语 法 格 式初始化完 全 初 始 化不 完 全 初 始 化省 略 数 组 大 小不 初 始 化使 用 memset 初 始 化 类 型访 问 元 素一 维 数 组 在 内 存 中 的 存 储 总结 💻作 者 简 介:曾 与 你 一 样 迷 茫,…...

[视频编码]rkmpp 实现硬件编码
mpi_enc_test的命令参数描述说明 命令参数的描述说明如下: 命令参数 描述说明 -i 输入的图像文件。 -o 输出的码流文件。 -w 图像宽度,单位为像素。 -h 图像高度,单位为像素。 -hstride 垂直方向相邻两行之间的距离,单…...

3D数字化:家居行业转型升级的关键驱动力
在科技日新月异的今天,家居行业正经历着一场前所未有的变革。从传统的线下实体店铺到线上电商平台的兴起,再到如今3D数字化营销的广泛应用,消费者的购物体验正在发生翻天覆地的变化。3D数字化营销不仅让购物变得更加智能和便捷,还…...

网安知识点
1.SQL注入漏洞产生的原因是? 前端传到后端的数据,没有经过任何处理,直接当作sql语句的一部分来执行 2.讲一下sql注入,写入webshell需要哪些前提条件 开启导入导出权限secure-file-priv 站点根目录位置/路径 mysql用户对站点根目…...

天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】
大模型风险与不当用例——价值观错位 大模型与人类价值观、期望之间的不一致而导致的安全问题,包含:• 社会偏见(Social Bias)LLM在生成文本时强化对特定社会群体的刻板印象,例如将穆斯林与恐怖主义关联,或…...

【kubernetes】service
目录 1. 说明2. 原理2.1 服务注册2.2 服务发现2.3 负载均衡 3. Service的类型3.1 ClusterIP3.2 NodePort3.3 LoadBalancer3.4 ExternalName 4. 使用场景 1. 说明 1.kubernetes中的service主要用于提供网络服务,并实现微服务架构中的几个核心功能:全自动…...

Python卷积神经网络(CNN)来识别和计数不同类型的工业零件
以下三种类型工业零件为例,使用卷积神经网络(CNN)来识别和计数不同类型的工业零件。以下是Python实现步骤: 数据准备:收集并标注包含不同形状(如方形、圆形、扇形)的工业零件图像数据集。 模型…...

MoonSharp 文档二
目录 6.Sharing objects 我们先来简单谈谈类型描述符 先说类型描述 稍微复杂一点 调用静态成员 应该使用 “:” 还是 “.” 重载 ByRef 参数(C# 中的 ref/out) 索引器 userdata 上的运算符和元方法 扩展方法 事件 关于 InteropAccessMode 的…...

android 支持自定义布局、线程安全、避免内存泄漏的 Toast 工具类
支持自定义布局:可以灵活地显示自定义样式的 Toast。 线程安全:确保在主线程中显示 Toast,避免崩溃。 避免内存泄漏:使用 ApplicationContext 和取消机制,防止内存泄漏问题。 工具类:作为一个通用的工具…...

景联文科技:以精准数据标注赋能AI进化,构筑智能时代数据基石
在人工智能技术席卷全球的浪潮中,高质量数据已成为驱动AI模型进化的核心燃料。作为全球领先的AI数据服务解决方案提供商,景联文科技深耕数据标注领域多年,以技术为基、以专业为本,致力于为全球客户提供全场景、高精度、多模态的数…...

Mysql的卸载安装配置以及简单使用
MySQL其它问题已经更新在:MySQL完善配置---可视化-CSDN博客 一、卸载 ①控制面板卸载 ②C盘隐藏项目>ProgramData>mysql相关文件夹,还有Program file下的MySQL文件夹 ③开始菜单栏搜索>服务,找到MySQL相关服务删除,如果再…...

使用 ResponseBodyEmitter 实现异步响应式数据流处理
1. 概述 1.1 什么是 ResponseBodyEmitter ResponseBodyEmitter 是 Spring MVC 提供的一个接口,用于支持异步返回响应数据流。它允许在控制器方法中逐步发送数据给客户端,而无需一次性生成完整的响应。 1.2 使用场景 实时数据推送(如股票行情、聊天消息等)。大量数据分批…...

Uniapp项目运行到微信小程序、H5、APP等多个平台教程
摘要:Uniapp作为一款基于Vue.js的跨平台开发框架,支持“一次开发,多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台,并解析常见问题。 一、环境准备 在开始前,请确保已安装以下工具…...

Ubuntu 下 nginx-1.24.0 源码分析 - cycle->modules[i]->type
Nginx 中主要有以下几种模块类型 类型 含义 NGX_CORE_MODULE 核心模块(如进程管理、错误日志、配置解析)。 NGX_EVENT_MODULE 事件模块(如 epoll、kqueue 等 IO 多路复用机制的实现)。 NGX_HTTP_MODULE HTTP 模块…...

基于SpringBoot的“文物管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“文物管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体功能模块图 E-R实体图 系统首页界面 系统…...

dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体
故事背景 stable-diffusion 集成进 dify 后,我们搭建一个小智能体,验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…...
Android原生gif动图加载AnimatedImageDrawable
Android原生gif动图加载AnimatedImageDrawable 从Android P(9.0)开始,Android系统支持gif动图的原生控件AnimatedImageDrawable,可以播放加载gif动图。 AnimatedImageDrawable官方文档链接: https://developer.andro…...

Windows 系统 Docker Desktop 入门教程:从零开始掌握容器化技术
文章目录 前言一、Docker 简介二、Docker Desktop 安装2.1 系统要求2.2 安装步骤 三、Docker 基本概念四、Docker 常用命令五、实战:运行你的第一个容器5.1 拉取并运行 Nginx 容器5.2 查看容器日志5.3 停止并删除容器 六、总结 前言 随着云计算和微服务架构的普及&…...

记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)
文章目录 记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…...

实战 - 使用 AutoAWQ 进行量化
文章目录 一、准备1、安装 autoawq2、模型准备 二、量化config.json 文件变化 三、加载量化后模型量化后的输出原始输出对比 四、查看模型的精度1、查看模型卡2、查看 config.json 中的 torch_dtype3、打印模型信息4、model.dtype 未必是模型精度 一、准备 1、安装 autoawq p…...

C++20 格式化库:强大的字符串格式化工具
文章目录 格式化语法常见用法1. 填充和对齐2. 数值格式化3. 进制格式化4. 自定义类型 示例代码注意事项 C20 的格式化库是一个强大的工具,用于处理字符串的格式化操作。它提供了类似于 Python 中 str.format() 的功能,但语法和用法更符合 C 的风格。以下…...

【一文学会 HTML5】
目录 HTML概述基本概念HTML 发展历程HTML 基本结构 网页基本标签标题标签(<h1> - <h6>)段落标签(<p>)换行标签(<br>)水平线标签(<hr>)注释࿰…...

如何在WPS中接入DeepSeek并使用OfficeAI助手(超细!成功版本)
目录 第一步:下载并安装OfficeAI助手 第二步:申请API Key 第三步:两种方式导入WPS 第一种:本地大模型Ollama 第二种APIKey接入 第四步:探索OfficeAI的创作功能 工作进展汇报 PPT大纲设计 第五步:我的使用体验(体验建议) …...

蓝耘智算 + 通义万相 2.1:为 AIGC 装上 “智能翅膀”,翱翔创作新天空
1. 引言:AIGC 的崛起与挑战 在过去几年中,人工智能生成内容(AIGC)技术突飞猛进。AIGC 涉及了文本生成、图像创作、音乐创作、视频制作等多个领域,并逐渐渗透到日常生活的方方面面。传统的内容创作方式已经被许多人类创…...

电脑如何在系统默认的壁纸中切换自己喜欢的
1、声明:该切换壁纸仅支持win10。 当你想去切换系统默认的壁纸,但是不知道该怎么切换,别慌,小亦教你几招帮你快速切换自定义壁纸。 我们平常使用的win10桌面壁纸大部分都是 简单、朴素的壁纸,但如果你想要切换自己喜…...

【大模型安全】安全解决方案
【大模型安全】安全解决方案 1.技术层面2.数据层面数据收集阶段训练阶段模型推理阶段 1.技术层面 在使用大语言模型时,通常有几种选择:一种是采用封装好的大语言模型SaaS云服务;另一种是在公有云上部署自有的大语言模型,并通过权…...