HTTP协议-JavaWeb核心前置

HTTP协议是JavaWeb开发的核心基础,Servlet/JSP的本质就是按照HTTP协议规范,处理客户端的HTTP请求、生成HTTP响应。掌握HTTP协议,是理解Web交互逻辑、排查Web程序报错的核心前提,也是后续学习Servlet、Cookie/Session的必备基础。


1 HTTP协议简介

1.1 核心定义

HTTP(HyperText Transfer Protocol,超文本传输协议)是应用层的标准化通信协议,规范了浏览器(客户端)与Web服务器(Servlet容器,如Tomcat)之间的通信规则,核心是约定了客户端与服务端之间传输数据的格式(即HTTP报文格式)。

其中,客户端发送给服务器的称为请求报文,服务器返回给客户端的称为响应报文

1.2 发展历程(JavaWeb开发核心关注HTTP/1.1)

  • HTTP/0.9(1991):HTTP原型版本,仅支持GET请求,仅能传输HTML文本,已完全淘汰。

  • HTTP/1.0(1996):新增POST、HEAD请求方法,支持请求/响应头、多类型内容传输;核心缺陷是每次请求都需新建TCP连接,性能低下。

  • HTTP/1.1(1997,RFC 2616,JavaWeb开发主流标准)

是Tomcat等Servlet容器默认支持的核心版本,核心改进如下:

  1. 持久连接(keep-alive):单个TCP连接可处理多个HTTP请求/响应,大幅降低连接开销;

  2. 虚拟主机支持:单IP可部署多个Web应用,对应Tomcat的Host配置;

  3. 完善的缓存控制机制;

  4. 新增OPTIONS、PUT、DELETE等标准请求方法,适配后续RESTful开发。

  • HTTP/2(2015):基于二进制帧,支持多路复用、头部压缩,性能大幅优化,Servlet 4.0+规范已兼容。

  • HTTP/3(2021):基于QUIC协议(UDP传输),进一步降低延迟、提升可靠性,主流云厂商与浏览器已支持。

1.3 HTTP协议核心特性(JavaWeb开发必须掌握)

这部分是后续Servlet、Cookie/Session技术的前置理论,为核心重点:

  1. 请求-响应模型:一次完整的HTTP通信,必须由客户端主动发起请求,服务器接收后处理并返回响应,无请求则无响应。

  2. 无连接特性:HTTP/1.0默认每次请求新建连接,处理完成立即断开;HTTP/1.1默认开启持久连接,可配置连接超时时间。

  3. 无状态特性:协议本身不记录客户端的历史请求信息,每次请求都是完全独立的。这是JavaWeb中Cookie、Session技术的核心设计背景——用于解决HTTP无状态带来的会话保持问题。

1.4 HTTP通信完整流程

简化为4个核心步骤,贴合Tomcat与JavaWeb的实际运行逻辑:

  1. 建立TCP连接:客户端根据URL的IP+端口,与服务器(Tomcat)建立TCP连接(HTTP默认端口80,Tomcat默认端口8080);

  2. 发送请求报文:客户端按照HTTP规范,向服务器发送请求报文;

  3. 处理请求并返回响应:Tomcat接收请求,交由对应Servlet处理业务逻辑,生成并返回响应报文;

  4. 关闭/复用连接:HTTP/1.1默认复用持久连接,超时后自动断开。

3.1.5 调试工具:浏览器F12开发者工具

所有主流浏览器均支持F12开发者工具,其中【网络(Network)】面板是JavaWeb开发调试的核心工具,可抓取、查看完整的请求/响应报文、状态码、请求参数、响应内容等。

例如:访问http://localhost:8080/05_web_tomcat/login.html出现“URL拼写可能存在错误”报错时,可通过该面板查看请求URL是否正确、响应状态码是否为404,快速定位问题。


2 HTTP请求与响应报文(核心重点,对应Servlet API)

【前置说明】JavaWeb中,HttpServletRequest对象就是对HTTP请求报文的完整封装,HttpServletResponse对象就是对HTTP响应报文的完整封装。掌握报文结构,就能直接理解Servlet中对应API的设计逻辑。

2.1 报文通用结构

HTTP报文分为报文首部报文主体,两者通过一个空行分隔:

  • 报文首部:包含请求/响应的控制信息,分为「行」和「头」两部分;

  • 报文主体:传输的业务数据(如表单参数、HTML页面、JSON数据等)。

2.2 请求报文(客户端→服务器,对应HttpServletRequest)

1. 请求报文完整结构

请求行
请求头
空行
请求体

2. 各部分详解(绑定Servlet对应API)

  • ① 请求行:请求报文的第一行,固定格式为请求方式 资源路径 协议/版本

示例:GET /05_web_tomcat/login.html HTTP/1.1

核心字段与Servlet API对应关系:

  • 请求方式:request.getMethod()

  • 资源路径:request.getRequestURI() / request.getRequestURL()

  • 协议版本:request.getProtocol()

  • ② 请求头:键值对格式,携带客户端环境信息、请求配置等,每行一个头信息

仅保留JavaWeb开发高频使用的请求头,如下表:

请求头 核心含义 对应Servlet API
Host 请求的服务器域名/IP+端口 request.getServerName() / request.getServerPort()
Connection 连接控制(keep-alive/close) request.getHeader("Connection")
Content-Type 请求体的数据类型(POST请求必填) request.getContentType()
Content-Length 请求体的字节长度 request.getContentLength()
Referer 请求的来源页面地址(防盗链、跳转回退) request.getHeader("Referer")
User-Agent 客户端(浏览器)的系统、版本信息 request.getHeader("User-Agent")
Cookie 客户端携带的Cookie数据 request.getCookies()
  • ③ 空行:分隔请求头与请求体,标识请求头传输结束

  • ④ 请求体:仅POST/PUT等请求存在,GET请求无请求体;用于传输客户端提交的业务数据(如表单参数、文件、JSON等)

对应Servlet API:request.getInputStream() / request.getReader() / request.getParameter()

3. 核心请求方式:GET与POST(JavaWeb开发最常用,表单提交核心)

特性 GET请求 POST请求
参数位置 拼接在URL后,格式为url?name1=value1&name2=value2,地址栏可见 放在请求体中,地址栏不可见
安全性 低,参数直接暴露,不可传输敏感数据 相对更高,参数不直接暴露
数据限制 受浏览器地址栏长度限制(一般约4KB),仅能传输文本 无长度限制,支持文本、二进制文件等
请求体 无请求体 有请求体,需配合Content-Type指定数据格式
缓存特性 浏览器默认会缓存 浏览器默认不缓存
开发场景 页面跳转、数据查询、无敏感信息的简单参数传递 表单提交、文件上传、敏感数据传输、数据增删改操作

提示:HTML表单默认提交方式为GET,需手动设置method="post"才会使用POST请求;Servlet中需通过doGet()/doPost()方法分别处理对应请求,方法不匹配会抛出405状态码错误。

2.3 响应报文(服务器→客户端,对应HttpServletResponse)

1. 响应报文完整结构

响应行
响应头
空行
响应体

2. 各部分详解(绑定Servlet对应API)

  • ① 响应行:响应报文的第一行,固定格式为协议/版本 状态码 状态描述

示例:HTTP/1.1 200 OK

核心字段与Servlet API对应关系:

  • 状态码:response.setStatus(int sc)

  • 协议版本:由Servlet容器自动设置,可通过response.getProtocol()获取

  • ② 响应头:键值对格式,携带服务器的响应配置、数据信息等,每行一个头信息

仅保留JavaWeb开发高频使用的响应头,如下表:

响应头 核心含义 对应Servlet API
Content-Type 响应体的数据类型与编码(浏览器据此解析内容) response.setContentType()
Content-Length 响应体的字节长度 response.setContentLength()
Location 重定向的目标地址(配合302状态码使用) response.sendRedirect() 底层依赖此头
Set-Cookie 服务器向客户端写入Cookie response.addCookie()
Cache-Control 缓存控制策略 response.setHeader("Cache-Control", "...")
Server 服务器信息(如Tomcat版本) 由Servlet容器自动设置
  • ③ 空行:分隔响应头与响应体,标识响应头传输结束

  • ④ 响应体:服务器返回的核心数据,浏览器会根据Content-Type解析渲染,如HTML页面、图片、JSON、文件等

对应Servlet API:response.getOutputStream() / response.getWriter()

3. 核心响应状态码(JavaWeb开发高频必掌握)

HTTP状态码为3位数字,首位代表响应类别,高频核心状态码如下:

状态码 核心含义 开发场景说明
200 OK 请求成功 正常访问页面、接口成功,服务器已正常返回数据
302 Found 临时重定向 Servlet中response.sendRedirect()的默认状态码,服务器要求客户端发起新的请求
304 Not Modified 资源未修改 客户端使用本地缓存的资源,服务器未返回新内容
400 Bad Request 请求语法错误 请求参数格式错误、请求体格式异常,服务器无法解析
404 Not Found 请求资源不存在 最常见报错之一,如URL拼写错误、项目未部署、资源路径错误、Servlet路径配置错误,对应本次案例中“URL拼写可能存在错误”的报错
405 Method Not Allowed 请求方法不允许 Servlet中未实现对应请求方法(如表单用POST提交,但Servlet仅重写了doGet())
500 Internal Server Error 服务器内部错误 服务器端代码运行异常,如Servlet中抛出空指针、SQL异常等,是后端代码报错的核心标识

提示:其他状态码可在开发中按需查阅,入门阶段优先掌握以上高频状态码,即可解决绝大多数Web程序调试问题。

【本章与后续JavaWeb内容的衔接】

后续学习的Servlet,本质就是Tomcat完成以下流程:

  1. 接收客户端的HTTP请求报文,封装为HttpServletRequest对象;

  2. 根据请求路径,调用对应Servlet的doGet()/doPost()方法处理业务逻辑;

  3. 开发者通过HttpServletResponse对象,封装生成符合HTTP规范的响应报文,由Tomcat返回给客户端。

(注: )

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容