21.14 HTTP缓存支持
一个好的HTTP缓存能够显著改善web应用及其客户端的体验。HTTP响应报头中的’Cache-Control’就是为其负责的。紧接这个报头后面可以有如’Last-Modified’和’ETag’这样的报头。
‘Cache-Control’这个HTTP响应报头会给私有缓存(如:浏览器)和公有缓存(如:代理服务器)提供关于怎样缓存这些HTTP响应的建议。
mvc-config-static-resources(MVC静态资源配置):ETag(实体标签),是一个符合HTTP/1.1 web服务器的,用于判断在指定URL中是否有变化的内容。它也可以被看作是Last-Modified报头的继任者。当服务端返回带有Etag报头的响应时,客户端可以在随后含有If-None-Match报头的GET请求中使用这个报头。如果其内容没被改变,服务端会返回304:not Modified错误。
本小节阐述了在Spring Web MVC应用中可以以此方式来配置HTTP缓存。
21.14.1 HTTP报头:Cache-Control
Spring Web MVC可以支持在应用中,以各种各样的方式来配置”Cache_Control”。在RFC7234 Section 5.2.2完整阐述了这个报头和其可能的指令的同时,也有一些方法来把其应用到一些常见的情况中。
Spring Web MVC在一些它的API中,使用一种配置规则:
setCachePeriod(int seconds):
- n 如果是-1,则不会生成’Cache-Control’响应报头。
- n 如果是0,会避免缓存,会使用’Cache-Control: no-store’这个指令。
- n 如果这个值n大于0,缓存就会在指定响应中保持n秒,使用‘Cache-Control: max-age=n’这个指令。
CacheContrl这个类可以使”Cache-Control”的指令生成时变得更加简单,还使开发者建立自己的HTTP缓存机制时更加方便。一旦这个类建立了,可以把其作为一个入参,在一些Spring Web MVC 的API中来使用它。
// 缓存一小时 - "Cache-Control: max-age=3600"
CacheControlccCacheOneHour = CacheControl.maxAge(1, TimeUnit.HOURS);
// 避免缓存 - "Cache-Control: no-store"
CacheControl ccNoStore =CacheControl.noStore();
// 在公有和私有缓存中储存10天,
// 公有缓存不能转为响应
//"Cache-Control: max-age=864000, public, no-transform"
CacheControl ccCustom =CacheControl.maxAge(10, TimeUnit.DAYS)
.noTransform().cachePublic();