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
相关产品推荐
相关产品推荐

