千家信息网

SpringMVC中的http Caching怎么用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要为大家展示了"SpringMVC中的http Caching怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SpringMVC中的http
千家信息网最后更新 2026年11月02日SpringMVC中的http Caching怎么用

这篇文章主要为大家展示了"SpringMVC中的http Caching怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SpringMVC中的http Caching怎么用"这篇文章吧。

Cache 是HTTP协议中的一个非常重要的功能,使用Cache可以大大提高应用程序的性能,减少数据的网络传输。

通常来说我们会对静态资源比如:图片,CSS,JS文件等做缓存。同样的我们可以使用HTTP Cache配合Spring MVC来做动态资源的缓存。

那么什么时候使用动态资源的缓存呢?

只有当这个资源不经常更新或者你确切的知道该资源什么时候更新的时候就可以使用HTTP Cache了。

HTTP Cache是通过请求头来实现的,主要有三种方式:过期时间,最后更新时间和Etag。

其中过期时间是客户端验证,最后更新时间和Etag是服务器端验证。

过期时间

过期时间又有两种方式,分别是Cache-Control和Expires头。

在Cache-Control中,我们可以设置它的maxAge,超出该时间后,该资源才会被再次请求。如下所示:

@GetMapping("/{id}")ResponseEntity getProduct(@PathVariable long id) {   // …   CacheControl cacheControl = CacheControl.maxAge(30, TimeUnit.MINUTES);   return ResponseEntity.ok()           .cacheControl(cacheControl)           .body(product);}

我们也可以在Head中设置Expires属性。Expires的时间需要是标准时间格式,如下:

Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format

如果要在java中使用,参考如下的例子:

@GetMapping("/forecast")ResponseEntity getTodaysForecast() {   // ...   ZonedDateTime expiresDate = ZonedDateTime.now().with(LocalTime.MAX);   String expires = expiresDate.format(DateTimeFormatter.RFC_1123_DATE_TIME);   return ResponseEntity.ok()           .header(HttpHeaders.EXPIRES, expires)           .body(weatherForecast);}

如果Cache-Control和Expires同时出现,则会优先使用 Cache-Control。

Last-Modified

它的验证逻辑是这样的,客户端会根据上次请求得到的Last-Modified设置它的If-Modified-Since,服务器端接收到了这个属性之后可以跟之前的进行比较,如果相同则可以返回一个空的body。如下所示:

@GetMapping("/{id}")ResponseEntity getProduct(@PathVariable long id, WebRequest request) {   Product product = repository.find(id);   long modificationDate = product.getModificationDate()           .toInstant().toEpochMilli();    if (request.checkNotModified(modificationDate)) {       return null;   }    return ResponseEntity.ok()           .lastModified(modificationDate)           .body(product);}

ETag

Last-Modified的时间只能精确到秒,如果还需要更细粒度的话,就需要用到ETag了。

ETag可以看成当前时刻某个资源的唯一标记,你可以取该资源的hash值作为ETag。

下面是它的一种实现:

@GetMapping("/{id}")ResponseEntity getProduct(@PathVariable long id, WebRequest request) {   Product product = repository.find(id);   String modificationDate = product.getModificationDate().toString();   String eTag = DigestUtils.md5DigestAsHex(modificationDate.getBytes());    if (request.checkNotModified(eTag)) {       return null;   }    return ResponseEntity.ok()           .eTag(eTag)           .body(product);}

Spring ETag filter

Spring提供了一个ShallowEtagHeaderFilter来根据返回的内容自动为你生成Etag。

@Beanpublic FilterRegistrationBean filterRegistrationBean () {   ShallowEtagHeaderFilter eTagFilter = new ShallowEtagHeaderFilter();   FilterRegistrationBean registration = new FilterRegistrationBean();   registration.setFilter(eTagFilter);   registration.addUrlPatterns("/*");   return registration;}

请注意, ETag计算可能会影响性能。

以上是"SpringMVC中的http Caching怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

时间 资源 内容 更新 时候 篇文章 缓存 验证 动态 客户 客户端 属性 性能 方式 服务器 学习 帮助 服务 相同 精确 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 花魁咖啡 百单网互联网科技有限公司怎么样 厦门中拓互联网络科技有限公司 疫情对互联网科技公司影响 远信互联网科技 华中科技大学互联网 科技互联网创业计划书 成都狮子座互联网科技 互联网科技有限公司 翻译 深圳互联网科技怎么样 互联网科技公司的市场部门 科技互联网的估值 阿里互联网科技公司 互联网金融科技公司干啥的 互联网科技项目计划书材料类 无锡工业互联网科技有限公司 科技互联网的核心竞争力 广州富喜互联网络科技 风投北京互联网科技 互联网 科技节活动 微视频大赛 南京欣网互联网络科技 互联网与未来科技 撒么互联网科技公司 互联网时代科技改变生活 互联网科技与大数据专业 天津腾达互联网科技有限公司 互联网公司黑科技创始人 半导体是互联网高科技吗 珠海东科互联网科技有限公司 北京瑞云互联网科技有限公司
0