溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用SpringBoot2.x配置靜態文件緩存

發布時間:2021-08-20 15:34:32 來源:億速云 閱讀:301 作者:chen 欄目:開發技術

本篇內容介紹了“如何使用SpringBoot2.x配置靜態文件緩存”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

配置文件yml配置

spring:
 resources:
   static-locations: classpath:/static/,classpath:/views/,classpath:/templates/
   chain:
      strategy:
        #MD5實現
        content:
          enabled: true
          paths: /**
        #版本號管理(與MD5實現方式同時存在時,需要指定不同的路徑,來分別實現對應的文件管理)
        #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配置靜態文件緩存

1、當第一次訪問時,所有的靜態資源文件沒有緩存,需要請求服務下載對應的文件

2、當第二次頁面加載時,因為我們開啟了緩存,瀏覽器會判斷是否有緩存

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

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

如何使用SpringBoot2.x配置靜態文件緩存

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

如何使用SpringBoot2.x配置靜態文件緩存

6、如果更新了,則說明該文件的再服務器端已經發生了改變,瀏覽器需要重新加載更新該文件

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

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

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

靜態資源版本控制

Spring 默認提供了靜態資源版本映射的支持。

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

時間戳實現

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

<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配置靜態文件緩存

MD5實現

首先在application.yml配置(在最上邊的配置文件內容中已經有了)

spring:
 resources:
   chain:
      strategy:
        #MD5實現
        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配置靜態文件緩存

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

簡單看了下源代碼,MD5的計算是通過 ContentVersionStrategy 這個類實現的。此VersionStrategy實現根據資源的內容計算MD5哈希值,并將其附加到文件名后面,也就是你不改變內容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

版本號實現

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

spring:
 resources:
   static-locations: classpath:/static/,classpath:/views/,classpath:/templates/
   chain:
      strategy:
        #版本號管理(與MD5實現方式同時存在時,需要指定不同的路徑,來分別實現對應的文件管理)
        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>

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

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

如何使用SpringBoot2.x配置靜態文件緩存

如圖,文件的路徑最前面會加上對應的版本號

總結

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

“如何使用SpringBoot2.x配置靜態文件緩存”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女