一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 使用SpringBoot2.x配置靜態(tài)文件緩存

使用SpringBoot2.x配置靜態(tài)文件緩存

2021-11-26 13:31小蘋果1357 Java教程

這篇文章主要介紹了使用SpringBoot2.x配置靜態(tài)文件緩存的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

HTTP瀏覽器緩存

對這部分知識不太熟悉的,可以先看一下這篇文章:HTTP瀏覽器緩存機制

 

配置文件yml配置

spring:
resources:
 static-locations: classpath:/static/,classpath:/views/,classpath:/templates/
 chain:
    strategy:
      #MD5實現(xiàn)
      content:
        enabled: true
        paths: /**
      #版本號管理(與MD5實現(xiàn)方式同時存在時,需要指定不同的路徑,來分別實現(xiàn)對應(yīng)的文件管理)
      #fixed:
        # 開啟版本控制策略,默認為false
        #enabled: true
        #paths: /**,/v1.0.0/**
        #version: v1.0.0
    cache: true
    compressed: false
    enabled: true
  #緩存
 cache:
    cachecontrol:
      cache-public: true
      # 緩存有效期 24小時
      max-age: 24h
    # 資源緩存時間,單位天,7天
    period: 7d

瀏覽器緩存的過程:

使用SpringBoot2.x配置靜態(tài)文件緩存

1、當?shù)谝淮卧L問時,所有的靜態(tài)資源文件沒有緩存,需要請求服務(wù)下載對應(yīng)的文件

2、當?shù)诙雾撁婕虞d時,因為我們開啟了緩存,瀏覽器會判斷是否有緩存

3、有緩存,需要判斷,緩存是否過期,過期時間就是通過配置緩存有效期:max-age: 24h,實現(xiàn)的

4、如果沒有過期,則靜態(tài)文件直接讀取瀏覽器緩存,不會向服務(wù)器重新訪問資源

使用SpringBoot2.x配置靜態(tài)文件緩存

5、如果沒有緩存或者緩存已經(jīng)過期,則需要請求服務(wù)器,并通過判斷Last-Modified:響應(yīng)資源的最后修改時間,是否更新,如果沒有更新,返回304狀態(tài),讀取瀏覽器緩存

使用SpringBoot2.x配置靜態(tài)文件緩存

6、如果更新了,則說明該文件的再服務(wù)器端已經(jīng)發(fā)生了改變,瀏覽器需要重新加載更新該文件

7、至此一個完整的瀏覽器緩存加載頁面靜態(tài)資源的過程就算完成了

8、當瀏覽器向服務(wù)器請求后,無論是沒有更新,返回304,還是有更新,重新加載文件,新一輪的緩存有效期生成,也就是之前過期的有效期,現(xiàn)在又重新開始計算時間,此時再訪問靜態(tài)文件,會直接讀取緩存,直到緩存再次過期,再進行下一次的循環(huán)。

9、我的配置中沒有使用Etag,因為它需要很多的md5運算,消耗較多的內(nèi)存,我覺得我的系統(tǒng)暫時可以不需要這一層

 

靜態(tài)資源版本控制

Spring 默認提供了靜態(tài)資源版本映射的支持。

當我們的資源內(nèi)容發(fā)生改變時,由于瀏覽器緩存,用戶本地的資源還是舊資源,為了防止這種情況發(fā)生導(dǎo)致的問題。我們可能會選擇在資源文件后面加上參數(shù)“版本號”或其他方式。

 

時間戳實現(xiàn)

在htnl中一如靜態(tài)文件時,加一個時間戳的后綴,每次加載時間戳是不一樣的,這樣能保證瀏覽器每次都向服務(wù)器重新請求加載

<script>
  document.write('<script type="text/javascript" src="script/basicschema/common.js?v=' + Date.now() + '"><\/script>');
</script>
<script>
  document.write('<script type="text/javascript" src="script/basicschema/basicdata/energyUnit.js?v=' + Date.now() + '"><\/script>');
</script>

使用SpringBoot2.x配置靜態(tài)文件緩存

 

MD5實現(xiàn)

首先在application.yml配置(在最上邊的配置文件內(nèi)容中已經(jīng)有了)

spring:
resources:
 chain:
    strategy:
      #MD5實現(xiàn)
      content:
        enabled: true
        paths: /**

其次,如果您恰巧和我一樣使用Thymeleaf作為模板引擎,則可以和我一樣使用@bean語法直接從模板訪問ResourceUrlProvider bean。

<script th:src="@{ ${@mvcResourceUrlProvider.getForLookupPath('/script/basicschema/common.js')}}"></script>
<script th:src="@{ ${@mvcResourceUrlProvider.getForLookupPath('/script/basicschema/benchmark/benchmarkItem.js')}}"></script>

使用SpringBoot2.x配置靜態(tài)文件緩存

注意:如果你的js文件沒有修改,或者修改沒重啟,MD5的值可能不會改變,當你重啟服務(wù)后你會看到你修改過后的文件MD5也隨之改變了。

簡單看了下源代碼,MD5的計算是通過 ContentVersionStrategy 這個類實現(xiàn)的。此VersionStrategy實現(xiàn)根據(jù)資源的內(nèi)容計算MD5哈希值,并將其附加到文件名后面,也就是你不改變內(nèi)容MD5值是不會變的

這種方式類似于Etag的方式,只不過,我們可以自主控制對哪些文件進行md5計算。

問題:使用ControllerAdvice這種方式,我嘗試了以后,不能用,html中使用urls,報錯,不識別,不知道什么原因,(有知道原因的可以告知一下)代碼如下:

代碼如下:

@ControllerAdvice
public class ControllerConfig {
  @Autowired
  ResourceUrlProvider resourceUrlProvider;
  @ModelAttribute("urls")
  public ResourceUrlProvider urls() {
      return this.resourceUrlProvider;
  }
}
<script type="text/javascript" th:src="@{${urls.getForLookupPath('/script/basicschema/benchmark/benchmarkItem.js') }}"></script>

這樣寫,就不行,頁面會報錯,不識別urls

 

版本號實現(xiàn)

在application.yml或者application.properties中增加配置文件

spring:
resources:
 static-locations: classpath:/static/,classpath:/views/,classpath:/templates/
 chain:
    strategy:
      #版本號管理(與MD5實現(xiàn)方式同時存在時,需要指定不同的路徑,來分別實現(xiàn)對應(yīng)的文件管理)
      fixed:
        enabled: true
        paths: paths: /**,/v1.0.0/**
        version: v1.0.0

其次,如果您恰巧和我一樣使用Thymeleaf作為模板引擎,則可以和我一樣使用@bean語法直接從模板訪問ResourceUrlProvider bean。

<script th:src="@{ ${@mvcResourceUrlProvider.getForLookupPath('/script/basicschema/common.js')}}"></script>
<script th:src="@{ ${@mvcResourceUrlProvider.getForLookupPath('/script/basicschema/benchmark/benchmarkItem.js')}}"></script>

正常來說,配置了相應(yīng)的映射路徑,則系統(tǒng)便會在文件路徑最前面加上相應(yīng)的版本號,當我們每次修改只需要更新版本號的設(shè)置,客戶端就會自動請求最新的數(shù)據(jù)了。

同樣的看了下此VersionStrategy的實現(xiàn)是FixedVersionStrategy類,來使固定版本字符串作為資源路徑的前綴。

使用SpringBoot2.x配置靜態(tài)文件緩存

如圖,文件的路徑最前面會加上對應(yīng)的版本號

 

總結(jié)

通過以上的配置,我們就可以做到即可以對一些第三方或者不會變的靜態(tài)文件進行緩存,減少每次加載文件的訪問量,又可以對一些需要經(jīng)常更改和變化的文件實現(xiàn)了單獨的控制,保證他可以及時更新,而不會一直是緩存文件。

當然不知道是不是因為用的是SpringBoot2.x的原因,從網(wǎng)上翻閱資料查到的一些實現(xiàn)方式,在我的系統(tǒng)里似乎有些方法和配置不好用,如果知道問題在哪的朋友,還望指點迷津。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/xue317378914/article/details/106638326

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 久久婷婷丁香五月色综合啪免费 | 午夜影院费试看黄 | 亚洲AV人无码综合在线观看蜜桃 | 午夜福利在线观看6080 | 手机看片自拍 | 99久久综合给久久精品 | japanesen女同| 青青草原免费在线视频 | 国产午夜精品久久理论片 | 99re这里只有精品视频在线观看 | 久久99精品国产免费观看 | 青青草在线观看 | 秋霞啪啪网 | 国产一区二区三区四卡 | 精品人人视屏 | 狠狠做五月深爱婷婷天天综合 | 高清在线看 | 女人把扒开给男人爽的 | 青草热视频| 男同gay作爰视频网站 | 国产成人黄网在线免 | 免费xxxxx大片在线观看影视 | 污软件在线观看 | 国产激情一区二区三区成人91 | 99精品在线视频 | 门房秦大爷最新章节阅读 | 久久精品国产色蜜蜜麻豆国语版 | 日韩伦理在线观看 | 二区三区视频 | 视频在线免费看 | 手机av| 91制片厂果冻传媒杨柳作品 | 天天性综合 | 91久久精品国产亚洲 | 亚洲国产成人久久午夜 | 美女的隐私视频免费看软件 | 亚洲欧美日韩国产一区二区精品 | 禁忌第一季第3季 | 狠狠色综合久久婷婷 | 91亚洲成人| 色婷婷久|