强缓存不发请求,直接从内存或磁盘读取资源,返回200状态码,依据cache-control(如max-age=3600)或expires;协商缓存会发请求,服务器比对etag或last-modified后返回304或200。

浏览器缓存区分强缓存和协商缓存,核心看请求是否真正发到服务器、以及响应状态码和资源读取方式。
强缓存:不发请求,直接读本地
强缓存生效时,浏览器完全跳过网络请求,资源从内存(from memory cache)或磁盘(from disk cache)直接加载,返回 200 状态码。
-
判断依据是响应头中的
Cache-Control或Expires; -
Cache-Control优先级更高,比如max-age=3600表示 1 小时内无需重验; -
Expires是绝对时间(如Wed, 21 Oct 2027 07:28:00 GMT),但依赖客户端时间准确,已逐渐被Cache-Control取代; - 若两者同时存在,浏览器只认
Cache-Control,Expires被忽略。
协商缓存:发请求,但服务器可能不发资源
强缓存失效后才触发协商缓存。浏览器仍会发起 HTTP 请求,但带上验证字段,服务器根据比对结果决定返回 304 Not Modified(复用本地缓存)还是 200 OK + 新资源。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 验证方式有两种,且服务器优先使用
ETag:
— 若响应含ETag: "abc123",后续请求带If-None-Match: "abc123";
— 若无ETag,则退而使用Last-Modified: Tue, 20 Aug 2026 10:00:00 GMT,请求带If-Modified-Since; - 只要比对一致,服务器返回空响应体 + 304,浏览器继续用本地缓存;
- 一旦资源有更新(ETag 不符 / 修改时间变新),服务器返回 200 和新内容,并附上新的 ETag 或 Last-Modified。
怎么快速判断当前走的是哪种缓存?
打开浏览器开发者工具 → Network 面板,选中某个 JS/CSS 资源,看两个关键点:
-
Size 列:显示
from memory cache或from disk cache→ 强缓存;显示304→ 协商缓存;显示200且 Size 是具体字节数 → 未命中任何缓存; -
Headers → Response Headers:检查是否存在
Cache-Control、Expires、ETag、Last-Modified,结合当前时间推算是否过期; -
Headers → Request Headers:若有
If-None-Match或If-Modified-Since,说明正在走协商流程。
为什么静态资源常加版本号或哈希值?
比如把 app.js 改成 app.a1b2c3.js,本质是让 URL 变更。浏览器将不同 URL 视为不同资源,旧缓存自动失效,新文件必然走完整强缓存流程(首次 200 → 后续 from disk cache)。这比依赖 max-age 或 ETag 更可控,避免用户卡在旧版本。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










