You need to enable JavaScript to run this app. Apache CachingHttpClientBuilder默认缓存行为?无Cache-Control头时默认缓存吗?
优惠活动
大模型
产品
解决方案
定价
更多

Apache CachingHttpClientBuilder默认缓存行为?无Cache-Control头时默认缓存吗?

无Cache-Control响应头场景的缓存判定逻辑

基于CachingHttpClientBuilder构建的Apache HttpClient缓存客户端,在响应完全缺失Cache-Control头的默认配置下,会触发缓存存储逻辑,并非默认不缓存,整套判定规则严格对齐RFC 7234定义的HTTP缓存语义。

具体判定规则拆解
  • 可缓存的基础触发条件:当无Cache-Control头时,客户端会先校验响应是否满足通用可缓存要求,只要满足以下所有条件就会将响应存入本地缓存:
    • 响应状态码属于可缓存范围(200、203、300、301、410)
    • 请求方法为GET或HEAD
    • 响应未携带Pragma: no-cache、Authorization头
    • 响应包含合法的Date头,且存在至少一个缓存校验头(Last-Modified或ETag)
  • 缓存有效期计算规则:无Cache-Control中的max-age等显式有效期定义时,客户端会走启发式计算逻辑:取响应Last-Modified时间与响应生成时Date时间差值的10%,作为该缓存条目的有效时长,最终生效值不会超过客户端配置的最大缓存上限。
  • 强制不缓存的边界:哪怕没有Cache-Control头,只要存在以下任意场景,客户端绝对不会执行缓存操作:
    • 响应状态码属于不可缓存范围(400、401、403、404、500、502、503等)
    • 请求携带Authorization头
    • 响应为分片返回的Content-Range内容
    • 客户端配置的缓存大小上限已被占满
常见认知误区澄清
  • 多数开发者“无Cache-Control即不缓存”的认知,来自部分浏览器的保守缓存策略,和CachingHttpClient的默认实现逻辑存在差异:前者在无明确缓存头时经常跳过缓存,后者严格遵循HTTP规范的启发式缓存规则,只要满足可缓存基础条件就会存储响应。
  • 如果需要修正默认行为,强制实现“无显式Cache-Control允许缓存标识就不存储响应”的逻辑,可以通过配置调整关闭启发式缓存开关,对应配置代码:
    CacheConfig customCacheConfig = CacheConfig.custom()
        .setHeuristicCachingEnabled(false)
        .build();
    CloseableHttpClient cachingClient = CachingHttpClientBuilder.create()
        .setCacheConfig(customCacheConfig)
        .build();
    
    关闭开关后,客户端会要求所有可缓存响应必须携带显式的Cache-Control: public或s-maxage、max-age这类缓存定义,否则直接跳过存储流程。

内容的提问来源于stack exchange,提问作者Dasmowenator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 02:45:04