JavaEE 初阶第二十九期:HTTP协议深度揭秘(三)
专栏:JavaEE初阶起飞计划
个人主页:手握风云
目录
一、HTTP 请求
1.1. 认识请求 "header" (报头)
1. Referer
2. Cookie
二、HTTP 响应
2.1. HTTP 状态码
一、HTTP 请求
1.1. 认识请求 "header" (报头)
1. Referer
Referer(正确拼写应为 Referrer,因历史错误沿用至今)是 HTTP 请求头字段,用于标识当前请求的来源页面 URL。作用是服务器通过 Referer 了解用户从何处跳转而来,用于流量统计、防盗链、内容推荐等。比如:当我们打开一个搜索引擎时,在搜索框里面输入一些内容跳转到另一个页面,再去点击这个网页上其他的连接、提交表单或者图片就会触发 Referer 请求。
需要注意:我们在浏览器的地址栏输入URL,点击书签栏里的连接,或者是使用Chrome浏览器的无痕模式,是不会发送Referer请求的。
2. Cookie
Cookie 是服务器发送到用户浏览器并存储在本地的小型数据文件,用于跟踪用户状态、偏好或行为。它是 HTTP 协议的 “无状态” 补充,让服务器能识别用户身份(如登录状态)。
从上图中我们可以看到 Cookie 的格式是键值对,多个键值对用 ;
分隔,单个键值对用 =
分隔 “键” 和 “值”。一个 Cookie 包含以下关键信息:名称 / 值,用于唯一标识用户的会话 ID;过期时间,分为会话Cookie(浏览器关闭后失效)和持久Cookie(某个网站的账号和密码);域 / 路径,限制 Cookie 的作用范围。
当用户通过浏览器访问某个网站时,所有数据都来自服务器,且 “无人审核”,理论上危险性更高。但浏览器会严格限制网站权限:禁止网站随意访问硬盘、调用电脑其他应用程序,因此能 “控制风险”(即使网站有风险,也不会对电脑造成大范围破坏)。Cookie 的内容由服务器返回给浏览器,浏览器再将其存储到本地,为了安全,网站不能 “随意读写硬盘”,只能按 “键值对” 这种简单格式存储少量数据(而非任意操作文件),这就是 Cookie 的产生与存储限制。
当我们在 Edge 浏览器里面打开百度的网址,在 URL前面的一个锁图标,就能查看 Cookie 和站点数据,会发现里面有2组Cookie。浏览器本地存储 Cookie 的时候按照域名维度进行管理的,虽然是不同的域名,但都是属于百度的。当我们点开一个 Cookie 之后,就可以看到里面的键值对。如果我们删除了这些 Cookie 之后,那么抓包结果请求里面就不会有 Cookie,但是响应报文里面会有 Set-Cookie。
Cookie的本质是浏览器在本地存储数据的一种机制 —— 把服务器返回的信息,以 “键值对” 形式存到本地硬盘。它相当于网站给用户的 “身份证”,让网站记住你是谁,但需警惕被冒用或窃取。所以 Cookie 的一个典型应用场景就是登录过程。
理解登录过程的核心是浏览器与服务器通过 HTTP 协议完成身份验证,并通过 “令牌” 实现后续身份识别。第一步,获取登录页面:当用户在浏览器中访问网站的登录页面时,浏览器会向服务器发送一个 HTTP 请求(通常是 GET 请求),目的是获取登录页面的 HTML 资源。服务器收到请求后,会返回包含登录表单(输入用户名、密码的界面)的 HTTP 响应,浏览器解析该响应后,展示出登录页面供用户操作。第二步,提交用户身份信息:用户在登录表单中输入用户名、密码(部分场景还需验证码等)并点击 “登录” 按钮后,浏览器会将这些身份信息通过 HTTP 请求(通常是 POST 请求)发送给服务器。第三步,服务器验证与发放令牌:服务器接收到用户的身份信息后,会在后台校验用户名和密码的正确性。若验证通过,服务器不会直接返回用户需要访问的页面,而是会生成一个唯一的身份令牌(Token),并通过 HTTP 响应的Set-Cookie
字段将令牌返回给浏览器。第四步,后续访问通过令牌识别身份:登录成功后,用户访问该网站的其他页面(如个人主页、设置页面)时,浏览器会自动在 HTTP 请求的 Cookie 字段中携带之前获取的令牌。服务器收到请求后,会校验 Cookie 中的令牌有效性:若令牌合法,则直接返回对应页面的资源;若令牌无效(如过期、篡改),则会要求用户重新登录。
我们可以把这个过程类比成去医院看病。患者到医院后,用户凭身份证挂号,得到一张 “就诊卡”(相当于登录中的 “令牌”),就诊卡记录了用户的身份信息。后面去科室检查、开药时,无需重复出示身份证,只需提供就诊卡,医生即可通过就诊卡识别用户身份并调取病历(相当于服务器通过令牌识别用户并提供对应资源)。看完病后,若注销就诊卡(或卡片过期),后续再就诊需重新挂号(相当于网站注销后,需重新输入用户名密码获取新令牌)。
令牌的安全性:令牌通常是加密后的字符串,仅服务器能解析其含义,即使黑客截获 Cookie 中的令牌,若未破解加密规则,也无法伪造身份;不同网站的令牌相互独立(不同域名下的Cookie
不冲突),例如码云的令牌无法用于访问百度一下,保障了身份标识的唯一性。
二、HTTP 响应
2.1. HTTP 状态码
- 200 OK,表示访问成功
HTTP 请求成功的标准响应。实际的响应将取决于所使用的请求方法。在GET请求中,响应将包含与请求的资源相对应的实体。在POST请求中,响应将包含描述或操作结果的实体。需要注意,这不代表在业务方面的成功,比如注册账号时,显示用户名已存在,导致提交失败。
- 404 Not Found
请求失败,请求所希望得到的资源未被在服务器上发现,但允许用户的后续请求。
- 403 Forbidden
服务器已经理解请求,但是拒绝执行它。比如在 gitee 中,我们以未登录的状态去访问自己的私密仓库时,就会访问受限。
- 502 Bad Gateway
特指代理服务器 / 网关从上游服务器(如后端应用服务器)收到无效或未完成的响应。通俗理解:“中间服务器(如 Nginx)想帮你转发请求,但上游服务器没给出合法回应”。502 错误的本质是代理与上游的通信失败,排查需结合日志分析、性能监控、网络诊断。日常通过缓存优化、限流降级、自动扩展可大幅降低风险。
- 301 Moved Permanently
301 是 3xx 重定向状态码,指示请求的资源已永久迁移至新地址(Location 头指定),客户端应更新所有对旧 URL 的引用(RFC 2616)。
- 302 Found
HTTP 302 Found 是 3xx 重定向状态码,指示请求的资源临时迁移至新 URL(Location 头指定),客户端每次请求旧 URL 时需重新验证,不缓存重定向规则(RFC 7231)。