最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC中的http Caching的具體使用

 更新時(shí)間:2021年09月02日 11:38:40   作者:flydean程序那些事  
本文主要介紹了SpringMVC中的http Caching的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Cache 是HTTP協(xié)議中的一個(gè)非常重要的功能,使用Cache可以大大提高應(yīng)用程序的性能,減少數(shù)據(jù)的網(wǎng)絡(luò)傳輸。

通常來(lái)說(shuō)我們會(huì)對(duì)靜態(tài)資源比如:圖片,CSS,JS文件等做緩存。同樣的我們可以使用HTTP Cache配合Spring MVC來(lái)做動(dòng)態(tài)資源的緩存。

那么什么時(shí)候使用動(dòng)態(tài)資源的緩存呢?

只有當(dāng)這個(gè)資源不經(jīng)常更新或者你確切的知道該資源什么時(shí)候更新的時(shí)候就可以使用HTTP Cache了。

HTTP Cache是通過(guò)請(qǐng)求頭來(lái)實(shí)現(xiàn)的,主要有三種方式:過(guò)期時(shí)間,最后更新時(shí)間和Etag。

其中過(guò)期時(shí)間是客戶(hù)端驗(yàn)證,最后更新時(shí)間和Etag是服務(wù)器端驗(yàn)證。

過(guò)期時(shí)間

過(guò)期時(shí)間又有兩種方式,分別是Cache-Control和Expires頭。

在Cache-Control中,我們可以設(shè)置它的maxAge,超出該時(shí)間后,該資源才會(huì)被再次請(qǐng)求。如下所示:

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

我們也可以在Head中設(shè)置Expires屬性。Expires的時(shí)間需要是標(biāo)準(zhǔn)時(shí)間格式,如下:

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<Forecast> 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同時(shí)出現(xiàn),則會(huì)優(yōu)先使用 Cache-Control。

Last-Modified

它的驗(yàn)證邏輯是這樣的,客戶(hù)端會(huì)根據(jù)上次請(qǐng)求得到的Last-Modified設(shè)置它的If-Modified-Since,服務(wù)器端接收到了這個(gè)屬性之后可以跟之前的進(jìn)行比較,如果相同則可以返回一個(gè)空的body。如下所示:

@GetMapping("/{id}")
ResponseEntity<Product> 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的時(shí)間只能精確到秒,如果還需要更細(xì)粒度的話,就需要用到ETag了。

ETag可以看成當(dāng)前時(shí)刻某個(gè)資源的唯一標(biāo)記,你可以取該資源的hash值作為ETag。

下面是它的一種實(shí)現(xiàn):

@GetMapping("/{id}")
ResponseEntity<Product> 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提供了一個(gè)ShallowEtagHeaderFilter來(lái)根據(jù)返回的內(nèi)容自動(dòng)為你生成Etag。

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

請(qǐng)注意, ETag計(jì)算可能會(huì)影響性能。

到此這篇關(guān)于SpringMVC中的http Caching的具體使用的文章就介紹到這了,更多相關(guān)SpringMVC http Caching內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中CountDownLatch工具類(lèi)詳細(xì)解析

    Java中CountDownLatch工具類(lèi)詳細(xì)解析

    這篇文章主要介紹了Java中CountDownLatch工具類(lèi)詳細(xì)解析,創(chuàng)建CountDownLatch對(duì)象時(shí),會(huì)傳入一個(gè)count數(shù)值,該對(duì)象每次調(diào)用countDown()方法會(huì)使count?--?,就是count每次減1,需要的朋友可以參考下
    2023-11-11
  • Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法

    Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法

    這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用Springboot封裝好的發(fā)送post請(qǐng)求的工具類(lèi)

    使用Springboot封裝好的發(fā)送post請(qǐng)求的工具類(lèi)

    本文介紹了在Springboot中封裝發(fā)送HTTP請(qǐng)求的工具類(lèi),并提供了普通的HTTP請(qǐng)求工具類(lèi)代碼和Response類(lèi)的使用示例,這些工具類(lèi)可為開(kāi)發(fā)者提供便利性和參考價(jià)值,幫助提高開(kāi)發(fā)效率
    2024-09-09
  • 分析JAVA中幾種常用的RPC框架

    分析JAVA中幾種常用的RPC框架

    這篇文章主要介紹了JAVA中幾種常用的RPC框架的相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友參考學(xué)習(xí)下吧。
    2018-03-03
  • 解決使用@Value(${×××))從properties文件取值的坑

    解決使用@Value(${×××))從properties文件取值的坑

    這篇文章主要介紹了解決使用@Value(${×××))從properties文件取值的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中BeanUtils.copyProperties基本用法與小坑

    Java中BeanUtils.copyProperties基本用法與小坑

    本文主要介紹了Java中BeanUtils.copyProperties基本用法與小坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • java的Jackson將json字符串轉(zhuǎn)換成泛型List

    java的Jackson將json字符串轉(zhuǎn)換成泛型List

    這篇文章主要介紹了java的Jackson將json字符串轉(zhuǎn)換成泛型List ,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。
    2017-02-02
  • Java事件監(jiān)聽(tīng)機(jī)制講解

    Java事件監(jiān)聽(tīng)機(jī)制講解

    今天小編就為大家分享一篇關(guān)于Java事件監(jiān)聽(tīng)機(jī)制講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Activiti如何啟動(dòng)流程并使流程前進(jìn)

    Activiti如何啟動(dòng)流程并使流程前進(jìn)

    這篇文章主要介紹了Activiti如何啟動(dòng)流程并使流程前進(jìn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • mybatis-plus插入一條數(shù)據(jù),獲取插入數(shù)據(jù)自動(dòng)生成的主鍵問(wèn)題

    mybatis-plus插入一條數(shù)據(jù),獲取插入數(shù)據(jù)自動(dòng)生成的主鍵問(wèn)題

    這篇文章主要介紹了mybatis-plus插入一條數(shù)據(jù),獲取插入數(shù)據(jù)自動(dòng)生成的主鍵問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

常熟市| 南澳县| 鄱阳县| 曲水县| 青神县| 乐东| 洮南市| 石棉县| 楚雄市| 庄浪县| 台东县| 临清市| 平塘县| 江永县| 娄底市| 文成县| 淮南市| 永清县| 开阳县| 黄梅县| 密山市| 昆明市| 济源市| 博湖县| 嘉黎县| 平阴县| 姚安县| 西丰县| 石门县| 香河县| 竹山县| 呼图壁县| 乌鲁木齐市| 邹城市| 灌阳县| 伊宁县| 长兴县| 巫山县| 商南县| 莱西市| 五莲县|