第71篇:HTTP协议详解(2026版)
📌 系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第70篇:Cookie与Session |
➡️ 下一篇:第72篇:JavaWeb面试高频题
🗺️ 本文阅读地图(3 分钟速览)
第70篇搞定了Cookie与Session,本篇深入 HTTP协议。HTTP是Java Web的"地基"——所有的Web开发都建立在这个协议之上。虽然日常开发中Spring MVC/Tomcat帮我们封装了大部分细节,但理解HTTP协议的本质,是写出高质量Web应用的必修课:
| 模块 | 核心问题 | 一句话回答 |
|---|---|---|
| HTTP是什么 | 浏览器和服务器怎么"说话"? | HTTP是浏览器和服务器之间通信的"语言"和"规则" |
| HTTP三大特点 | HTTP有什么核心特征? | 基于TCP、请求-响应模型、无状态 |
| 请求协议结构 | 浏览器发给服务器的数据长什么样? | 请求行 + 请求头 + 空行 + 请求体 |
| 响应协议结构 | 服务器返回的数据长什么样? | 响应行 + 响应头 + 空行 + 响应体 |
| 常见状态码 | 200/301/302/400/403/404/500什么意思? | 2xx成功、3xx重定向、4xx客户端错误、5xx服务器错误 |
| GET vs POST | 两者到底有什么区别? | GET参数在URL(有大小限制),POST参数在请求体(无大小限制) |
| HTTPS | HTTPS比HTTP安全在哪? | 多了SSL/TLS加密层,HTTP明文传输 |
| HTTP/2 vs HTTP/3 | 新版本有什么改进? | HTTP/2多路复用,HTTP/3用QUIC替代TCP解决队头阻塞 |
一、核心知识点
1. HTTP是什么?
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。简单来说,它是浏览器(客户端)和网站服务器之间进行沟通的"语言"和"规则"。
💡 本质理解:HTTP规定了浏览器和服务器之间数据传输的规则——请求数据和响应数据都必须按照固定的格式进行传输。Web服务器(如Tomcat)负责把复杂的协议文本转换成简单的Java对象(Request/Response),让我们以面向对象的方式编程。
2. HTTP的三大核心特点
| 特点 | 说明 | 影响 |
|---|---|---|
| 基于TCP协议 | 面向连接、可靠传输 | 数据不会丢失,安全可靠 |
| 请求-响应模型 | 一次请求对应一次响应,先请求后响应 | 没有请求就没有响应 |
| 无状态协议 | 服务器不记录任何用户信息,每次请求-响应都是独立的 | 速度快,但多次请求间不能共享数据 |
💡 无状态的"坑" :HTTP无状态是指服务器响应完后不会记录任何信息。比如你加入购物车后去结算,服务器不知道你加了什么——这就是Cookie和Session诞生的原因。优点:速度快;缺点:多次请求间不能共享数据。
二、通俗讲解(1分钟开心学)
把HTTP想象成"餐厅点餐"
- 你(浏览器) :顾客
- 服务员(Web服务器/Tomcat) :负责接单和上菜
- HTTP协议:你们之间约定的"点餐规则"
点餐流程:
- 请求(Request) :你对服务员说"我要一份宫保鸡丁"——这就是HTTP请求
- 处理(Processing) :服务员把订单传给后厨——这就是服务器处理业务逻辑
- 响应(Response) :后厨做好菜,服务员端给你——这就是HTTP响应
HTTP的"无状态" :服务员记性不好,你点完菜他就忘了你是谁。下次来他完全不记得你上次点了什么——这就是HTTP无状态。所以餐厅给你发了张会员卡(Cookie) ,卡上写着你的卡号(Session ID),后台档案柜(Session)存着你的完整信息。
三、HTTP请求协议详解
一个完整的HTTP请求由 请求行 + 请求头 + 空行 + 请求体 四部分组成。

3.1 请求行(Request Line)
请求行是HTTP请求的第一行数据,由三部分组成:
| 组成部分 | 说明 | 示例 |
|---|---|---|
| 请求方法 | 告诉服务器要做什么 | GET、POST |
| 资源路径(URI) | 告诉服务器要去哪里取/提交数据 | /brand/findAll?name=OPPO |
| 协议版本 | 告诉服务器用哪个HTTP版本 | HTTP/1.1 |
3.2 常见请求方法
| 方法 | 说明 | 使用场景 |
|---|---|---|
| GET | 获取资源 | 查询数据、访问页面 |
| POST | 传输实体主体,提交数据 | 登录、注册、上传文件 |
| PUT | 传输文件 | 更新资源 |
| DELETE | 删除文件 | 删除资源 |
| HEAD | 获得报文首部(不返回数据) | 确认URI有效性 |
| OPTIONS | 询问服务器支持哪些方法 | 跨域预检请求 |
💡 最常用:GET 和 POST,面试必问!
3.3 常见请求头(Request Headers)
请求头以 key: value 格式呈现:
| 请求头 | 说明 | 示例 |
|---|---|---|
Host | 请求的主机名 | Host: www.example.com |
User-Agent | 浏览器版本标识 | Mozilla/5.0 Chrome/91.0 |
Accept | 浏览器能接收的资源类型 | text/html,application/json |
Accept-Language | 偏好的语言 | zh-CN,zh;q=0.9 |
Accept-Encoding | 支持的压缩类型 | gzip, deflate |
Content-Type | 请求主体的数据类型 | application/json |
Content-Length | 数据主体大小(字节) | Content-Length: 348 |
Cookie | 携带的Cookie数据 | Cookie: JSESSIONID=ABC123 |
3.4 GET vs POST —— 面试必问
| 对比维度 | GET | POST |
|---|---|---|
| 参数位置 | 请求行(URL中) | 请求体(Body)中 |
| 参数大小 | 有限制(URL长度限制) | 无限制 |
| 安全性 | 参数暴露在URL中,不安全 | 参数在请求体中,相对安全 |
| 缓存 | 可被浏览器缓存 | 不会被缓存 |
| 书签 | 可收藏为书签 | 不可收藏 |
| 使用场景 | 查询、获取数据 | 提交、修改、删除数据 |
GET请求示例(参数在URL中):
GET /brand/findAll?name=OPPO&status=1 HTTP/1.1
Host: www.example.com
POST请求示例(参数在请求体中):
POST /user/login HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
username=zhangsan&password=123456
四、HTTP响应协议详解
一个完整的HTTP响应由 响应行 + 响应头 + 空行 + 响应体 四部分组成。

4.1 常见响应头(Response Headers)
| 响应头 | 说明 | 示例 |
|---|---|---|
Content-Type | 响应内容的类型 | text/html、application/json |
Content-Length | 响应内容的长度(字节) | Content-Length: 348 |
Content-Encoding | 响应压缩算法 | gzip |
Cache-Control | 缓存策略 | max-age=300 |
Set-Cookie | 设置Cookie | Set-Cookie: JSESSIONID=ABC123 |
Location | 重定向地址 | Location: /login.html |
五、HTTP状态码 —— 面试必问
状态码由三位数字组成,首位数字决定类型。面试时不仅要记住数字,更要说清楚场景。
5.1 五大分类
| 分类 | 范围 | 含义 | 代表状态码 |
|---|---|---|---|
| 1xx | 100-199 | 信息响应,请求正在处理 | 100 Continue |
| 2xx | 200-299 | 成功,请求被正确处理 | 200 OK |
| 3xx | 300-399 | 重定向,需要进一步操作 | 301、302 |
| 4xx | 400-499 | 客户端错误 | 400、401、403、404 |
| 5xx | 500-599 | 服务器错误 | 500 |
5.2 高频状态码详解
| 状态码 | 含义 | 一句话解释 | 发生场景 |
|---|---|---|---|
| 200 OK | 请求成功 | “一切正常” | 查询成功、页面正常加载 |
| 301 Moved Permanently | 永久重定向 | “这个地址永久搬家了” | 域名更换、HTTPS强制跳转 |
| 302 Found | 临时重定向 | “这次先换个地址” | 登录后跳转、未登录跳转登录页 |
| 400 Bad Request | 请求语法错误 | “你发的请求格式不对” | 参数格式错误、JSON格式错误 |
| 401 Unauthorized | 未授权 | “你没登录,不给你看” | 未登录访问需鉴权接口 |
| 403 Forbidden | 禁止访问 | “登录了也不给你看” | 权限不足(如普通用户访问管理员接口) |
| 404 Not Found | 资源不存在 | “你要的东西不存在” | URL写错、资源被删除 |
| 500 Internal Server Error | 服务器内部错误 | “服务器代码出bug了” | 空指针异常、数据库连接失败 |
💡 面试加分:301和302的区别是面试高频!301是永久重定向(浏览器会缓存新地址),302是临时重定向(每次都要去原地址)。
六、HTTPS —— HTTP的安全版本
6.1 HTTP的三大安全缺陷
HTTP采用明文传输,默认监听80端口,存在三大缺陷:
- 窃听风险:传输内容可被中间人截获
- 篡改风险:传输内容可被中间人修改
- 冒充风险:无法确认对方身份
6.2 HTTPS = HTTP + SSL/TLS
HTTPS在HTTP和TCP之间加入了一层SSL/TLS加密层,默认监听443端口。
💡 通俗理解:HTTP是"寄明信片"——任何人都能看到内容。HTTPS是"寄挂号信"——内容加密,只有收信人能看,而且能确认发信人身份。
6.3 TLS 1.2 vs TLS 1.3
2026年主流已经是 TLS 1.3:
| 对比维度 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手往返次数 | 2次(2-RTT) | 1次(1-RTT),支持0-RTT模式 |
| 握手速度 | 较慢 | 快50%以上 |
| 加密算法 | 支持多种(含弱算法) | 移除弱算法,强制前向保密 |
| 握手消息 | 部分明文 | 全程加密 |
💡 RTT解释:RTT(Round-Trip Time)是网络往返延迟。TLS 1.3将握手从2次往返减少到1次,显著降低连接建立延迟。
七、HTTP/2 与 HTTP/3 —— 新时代的HTTP
7.1 HTTP/1.1 的痛点
- 同一连接只能串行处理请求,浏览器需要建立多个TCP连接
- 请求头重复传输,浪费带宽
- 存在"队头阻塞"——前面的请求慢了,后面的都得等
7.2 HTTP/2 的核心改进
HTTP/2在TCP基础上引入了三大改进:
| 改进 | 说明 | 效果 |
|---|---|---|
| 多路复用(Multiplexing) | 一个TCP连接同时处理多个请求/响应 | 减少连接数,提升并发 |
| 头部压缩(HPACK) | 压缩重复的请求头 | 减少85-90%的头部大小 |
| 服务器推送(Server Push) | 服务器主动推送资源 | 减少页面加载等待 |
💡 效果:HTTP/2比HTTP/1.1快20-50%
7.3 HTTP/3 的革命性升级
HTTP/3用 QUIC协议 替代了TCP:
| 对比 | HTTP/2 | HTTP/3 |
|---|---|---|
| 传输层 | TCP | QUIC(基于UDP) |
| 队头阻塞 | 存在(TCP层面的阻塞) | 解决(独立数据流互不影响) |
| 连接建立 | TCP握手 + TLS握手(2-3 RTT) | QUIC内置TLS 1.3(1-2 RTT) |
| 网络切换 | 连接断开需重连 | Connection ID支持无缝迁移 |
💡 一句话总结:HTTP/2解决了"应用层"的队头阻塞,但TCP层的队头阻塞依然存在。HTTP/3用QUIC彻底解决了这个问题。
八、避坑要点
| 错误/误区 | 后果 | 正确做法 |
|---|---|---|
| 混淆GET和POST的使用场景 | 用GET提交敏感信息(密码暴露在URL) | GET用于查询,POST用于提交/修改数据 |
| 认为POST比GET更安全 | 只是"相对安全"(抓包一样能看到) | 真正安全用HTTPS |
| 忘记处理HTTP状态码 | 前端无法正确处理异常 | 后端统一返回规范状态码+错误信息 |
| 不理解301和302的区别 | 浏览器缓存了301导致无法回退 | 临时跳转用302,永久迁移用301 |
| 生产环境用HTTP明文传输 | 密码、Token被中间人截获 | 生产环境强制HTTPS |
| 忽略Content-Type设置 | 前端无法正确解析响应数据 | JSON接口设置application/json |
| 认为有了HTTPS就绝对安全 | SSL证书过期、中间人攻击仍存在 | 定期检查证书,配置HSTS |
九、面试高频考点
Q1:HTTP有哪些特点?
三大特点:①基于TCP协议——面向连接、可靠传输;②请求-响应模型——一次请求对应一次响应;③无状态协议——服务器不记录任何用户信息,每次请求-响应都是独立的。无状态带来速度快的好处,但也导致多次请求间不能共享数据,所以Java提出了Cookie和Session来解决这个问题。
Q2:GET和POST的区别?
①参数位置不同:GET参数在请求行(URL)中,POST参数在请求体中;②参数大小限制不同:GET有大小限制(URL长度限制),POST无限制;③安全性不同:GET参数暴露在URL中,POST相对安全;④使用场景不同:GET用于获取数据,POST用于提交数据;⑤缓存不同:GET可被缓存,POST不可缓存。
Q3:301和302的区别?
301是永久重定向(Moved Permanently),表示资源已永久迁移到新地址,浏览器会缓存新地址,后续直接访问新地址。302是临时重定向(Found),表示资源临时换个地址访问,浏览器不会缓存,每次仍访问原地址。301常见于域名更换、HTTPS强制跳转;302常见于登录后跳转。
Q4:HTTP和HTTPS的区别?
HTTPS = HTTP + SSL/TLS加密层。HTTP采用明文传输,存在窃听、篡改、冒充三大风险;HTTPS对传输内容加密,安全性高。HTTP默认端口80,HTTPS默认端口443。
Q5:HTTP/2和HTTP/3有什么区别?
HTTP/2引入了多路复用、头部压缩(HPACK)、服务器推送,但底层仍是TCP,存在TCP层的队头阻塞。HTTP/3用QUIC协议替代TCP,彻底解决了队头阻塞问题,连接建立更快(1-2 RTT vs 2-3 RTT),且支持网络无缝切换。
🎤 面试官追问陷阱(加分题)
追问1:“HTTP无状态,那你怎么实现’记住用户登录状态’?”
👉 HTTP本身无状态,但可以通过Cookie和Session来弥补。服务器创建Session并生成Session ID,通过
Set-Cookie响应头下发给浏览器,浏览器后续请求自动在请求头中携带Cookie: JSESSIONID=xxx。服务器根据Session ID识别用户身份。这就是会话跟踪技术的核心原理。
追问2:“同样是重定向,为什么登录跳转用302而不是301?”
👉 因为登录跳转是临时性的——用户未登录时跳转到登录页,登录后又跳转回来。如果用301,浏览器会永久缓存这个重定向,下次用户直接访问登录页URL也会被浏览器自动跳转,造成混乱。302是临时重定向,浏览器每次都会先请求原地址,由服务器决定是否跳转,更灵活。
追问3:“用户说’网页打不开,显示404’,可能是什么原因?”
👉 404表示"资源不存在",可能原因:①URL拼写错误;②资源已被删除或移动;③部署时资源没有正确放到webapps目录下;④路由配置错误(如Spring MVC的
@RequestMapping路径写错)。排查顺序:先确认URL是否正确,再检查服务端是否有对应资源。
十、练习题
-
简答题:HTTP协议为什么是"无状态"的?无状态带来了什么优缺点?
-
代码题:在Spring Boot中,分别写一个GET请求和POST请求的Controller接口,并说明请求参数分别从哪里获取。
-
分析题:某系统上线后,用户反馈"登录成功后跳转到了错误页面"。后端日志显示:登录成功后返回了302,但浏览器实际跳转到了
/error。请分析可能的原因。
📊 你的学习进度
- 当前:第71篇 / 共108篇 · 进阶篇:JavaWeb核心技术(第68~72篇)
- ✅ 已完成:基础篇44篇 + 第45~71篇
- 📖 正在学:第71篇
- ⏳ 待学习:第72~108篇
👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇
👉 下一篇文章预告
🚀 下一篇:《第72篇:JavaWeb面试高频题》
内容简介:转发(forward)vs 重定向(sendRedirect)的区别、
getParametervsgetAttribute、Filter与Interceptor的区别、JavaWeb专题面试高频20问。
👉 JavaWeb专题收官之作,拿下所有面试考点!
📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!
544


&spm=1001.2101.3001.11974&articleId=163513207&d=1&t=3&u=af651becc94a4c65b69142d4839e25d1)

被折叠的 条评论
为什么被折叠?



