温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java HTTP协议中的缓存策略

发布时间:2025-12-10 07:58:18 来源:亿速云 阅读:103 作者:小樊 栏目:编程语言

Java 中的 HTTP 缓存策略实战指南

一 核心概念与工作流程

  • 强缓存:客户端在max-age有效期内直接使用本地副本,不发请求;由Cache-Control: max-age=秒Expires: GMT时间控制,二者同时存在时以max-age 优先级更高。适合版本稳定、可长期缓存的资源。
  • 协商缓存:缓存已过期或需要验证时,客户端携带If-None-Match/If-Modified-Since询问服务器;服务器比较ETag/Last-Modified,未变化返回304 Not Modified,变化则返回200与新内容。
  • 常用请求/响应头:Cache-Control(max-age、s-maxage、public、private、no-cache、no-store、must-revalidate、immutable)、ExpiresPragma: no-cache(HTTP/1.0 兼容)、Last-Modified/If-Modified-SinceETag/If-None-Match
  • 验证优先级:一般ETag 优先于 Last-Modified;no-cache 表示“用前必须验证”,而 no-store 表示“禁止缓存”。

二 在 Java 中的落地实现

  • 原生 Servlet 设置响应头(强缓存 + 协商缓存)
    • 强缓存示例:设置Cache-Control: public, max-age=3600Expires为当前时间+3600秒。
    • 协商缓存示例:设置Last-Modified(响应)与If-Modified-Since(请求)比对;设置ETag(响应)与If-None-Match(请求)比对;未修改时返回304
    • 禁用缓存示例:设置Cache-Control: no-cache, no-store, must-revalidatePragma: no-cacheExpires: 0
  • Spring Boot 与常见框架
    • 静态资源:通过**WebMvcConfigurer.addResourceHandlers(…).setCachePeriod(3600)**统一设置缓存秒数。
    • 轻量 ETag:注册ShallowEtagHeaderFilter由内容摘要自动生成弱 ETag,配合 304 减少传输。
    • 典型组合:静态资源用“强缓存 + 文件名哈希/版本号”;动态接口用“no-cache + ETag/Last-Modified 协商”。

三 常见场景与推荐配置

场景 推荐响应头 说明
静态资源(带内容哈希/版本) Cache-Control: public, max-age=31536000(1年), immutable 长期强缓存;内容变化通过文件名变更失效,避免 304 往返
静态资源(不带哈希) Cache-Control: public, max-age=3600;Last-Modified;ETag 以协商缓存兜底,未变更返回 304
私有/用户态数据 Cache-Control: private, max-age=600 仅浏览器可缓存,避免共享缓存泄露
敏感/隐私数据 Cache-Control: no-store 禁止任何缓存,优先安全
需每次验证的接口 Cache-Control: no-cache;ETag 或 Last-Modified 每次用前验证,未变 304,变则 200
禁用缓存(开发/调试) Cache-Control: no-cache, no-store, must-revalidate;Pragma: no-cache;Expires: 0 全链路不缓存,确保拿最新内容
说明:s-maxage专用于共享缓存(如CDN/代理),可覆盖 max-age;对私有响应通常设为 private 或省略 s-maxage。

四 验证与排错要点

  • 观察响应头是否包含期望的Cache-Control/Expires/ETag/Last-Modified;协商缓存命中时应返回304且响应体为空。
  • 使用浏览器开发者工具的Network面板查看请求/响应头与状态码;核对max-age是否生效、ETag是否变更。
  • 避免“强缓存导致版本不更新”:静态资源采用文件名加哈希/版本号或在变更时主动更新ETag;必要时缩短max-age或改为协商缓存。
  • 注意兼容性:部分老旧代理/客户端可能不完全支持Cache-Control,可同时设置ExpiresPragma做兜底,但以 Cache-Control 为准。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI