欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年08月20日 14:33:56   作者:小蘋果1357  
這篇文章主要介紹了使用SpringBoot2.x配置靜態(tài)文件緩存的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

HTTP瀏覽器緩存

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

配置文件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:
          # 開啟版本控制策略,默認(rèn)為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

瀏覽器緩存的過程:

在這里插入圖片描述

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

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

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

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

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

當(dāng)我們的資源內(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>

在這里插入圖片描述

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>

在這里插入圖片描述

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

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

這種方式類似于Etag的方式,只不過,我們可以自主控制對哪些文件進(jìn)行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)的版本號,當(dāng)我們每次修改只需要更新版本號的設(shè)置,客戶端就會自動請求最新的數(shù)據(jù)了。

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

在這里插入圖片描述

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

總結(jié)

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

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

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

相關(guān)文章

  • Java?將list集合數(shù)據(jù)按照時間字段排序的方法

    Java?將list集合數(shù)據(jù)按照時間字段排序的方法

    這篇文章主要介紹了Java?將list集合數(shù)據(jù)按照時間字段排序,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java中Scanner使用方式:單行/多行輸入

    Java中Scanner使用方式:單行/多行輸入

    這篇文章主要介紹了Java中Scanner使用方式:單行/多行輸入,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 使用Spark?SQL實現(xiàn)讀取不帶表頭的txt文件

    使用Spark?SQL實現(xiàn)讀取不帶表頭的txt文件

    這篇文章主要為大家詳細(xì)介紹了如何使用Spark?SQL實現(xiàn)讀取不帶表頭的txt文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • java中實體類實現(xiàn)時間日期自動轉(zhuǎn)換方式

    java中實體類實現(xiàn)時間日期自動轉(zhuǎn)換方式

    這篇文章主要介紹了java中實體類實現(xiàn)時間日期自動轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 完全解析Java編程中finally語句的執(zhí)行原理

    完全解析Java編程中finally語句的執(zhí)行原理

    這篇文章主要深度介紹了Java編程中finally語句的執(zhí)行原理,細(xì)致講解了finally在異常處理中的流程控制作用,需要的朋友可以參考下
    2015-11-11
  • SpringBoot集成P6Spy實現(xiàn)SQL日志的記錄詳解

    SpringBoot集成P6Spy實現(xiàn)SQL日志的記錄詳解

    P6Spy是一個框架,它可以無縫地攔截和記錄數(shù)據(jù)庫活動,而無需更改現(xiàn)有應(yīng)用程序的代碼。一般我們使用的比較多的是使用p6spy打印我們最后執(zhí)行的sql語句
    2022-11-11
  • Spring Cloud Zuul添加過濾器過程解析

    Spring Cloud Zuul添加過濾器過程解析

    這篇文章主要介紹了Spring Cloud Zuul添加過濾器過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • 詳解Java中ThreadLocal類型及簡單用法

    詳解Java中ThreadLocal類型及簡單用法

    ThreadLocal實例通常是希望將狀態(tài)與線程關(guān)聯(lián)起來的類中的私有靜態(tài)字段,下面通過例子給大家詳細(xì)介紹Java中ThreadLocal類型及簡單用法,感興趣的朋友跟隨小編一起看看吧
    2021-10-10
  • JDBC中Statement的Sql注入問題詳解

    JDBC中Statement的Sql注入問題詳解

    這篇文章主要介紹了JDBC中Statement的Sql注入問題詳解,sql注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入web應(yīng)用程序,而這些輸入大都是sql語法里的一些組合,通過執(zhí)行sql語句進(jìn)而執(zhí)行攻擊者所要做的操作,需要的朋友可以參考下
    2023-10-10
  • Mybatis中通過generator生成mapper、Dao、mapper.xml的方法

    Mybatis中通過generator生成mapper、Dao、mapper.xml的方法

    這篇文章主要介紹了Mybatis中通過generator生成mapper、Dao、mapper.xml的方法,需要的朋友可以參考下
    2017-01-01

最新評論