SpringBoot2 0實現靜態資源版本控制

2022-01-29 07:43:40 字數 2283 閱讀 8237

猶記畢業第一年時,公司每次發布完成後,都會在乙個群裡通知【版本更新,各部門清理快取,有問題及時反饋】之類的話。歸根結底就是資源快取的問題,瀏覽器會將請求到的靜態資源,如js、css等檔案快取到使用者本地,當使用者再次訪問時就不需要再次請求這些資源了,以此也是提公升了使用者體驗。但是也正是因為這些資源快取,導致客戶端的靜態檔案往往不是當前最新版本。後來有同事增加了時間戳、隨機數等,確實這也解決了客戶端快取的問題,但是卻又帶來了新的麻煩,導致每次訪問都要請求伺服器,無形中增加了伺服器的壓力。

那麼有什麼辦法可以讓客戶端當需要更新時才去請求,不需更新就不請求嗎?當然有,實現方式很多種,像前端實現,webjars實現等都可以,但是麻煩還是麻煩,太燒腦。介紹一種spring自身提供的方式,也是我目前所應用的方式,resourceurlprovider

。resourceurlprovider的實現效果有兩種,大家可以在後文中看到。

spring: 

resources:

chain:

strategy:

content:

enabled: true

paths: /**

其次,如果您恰巧和我一樣使用thymeleaf作為模板引擎,則可以和我一樣

使用@bean

語法直接從模板

訪問resourceurlprovider

bean。

<

script

th:src

="$"

>

script

>

如果您使用的模板引擎無法直接訪問spring bean,則可以將

resourceurlprovider

新增到spring中。

使用controlleradvice

,**如下:

@controlleradvice

public

class

controllerconfig

}

然後在頁面上通過下述**引用:

<

script

th:src

="$"

>

script

>

此方法應適用於支援方法呼叫的所有模板引擎。

下面我們來看看具體的實現效果吧,前台訪問後html頁面顯示為:

<

script

src="/mods/admin/login-96d770c87905659930c9786eaa08d710.js"

>

script

>

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

簡單看了下源**,md5的計算是通過 contentversionstrategy 這個類實現的。此

versionstrategy

實現根據資源的內容計算md5雜湊值,並將其附加到檔名後面,也就是你不改變內容md5值是不會變的哦,一度讓我以為這種方法有bug(。•ˇ‸ˇ•。)

spring: 

resources:

chain:

strategy:

fixed:

enabled: true

paths: /mods/admin/*.js

version: 20181128

後續操作同上,此時我們看下頁面顯示的效果:

<

script

src="/20181128/mods/admin/login.js"

>

script

>

在檔案路徑的最前面增加了版本號,當我們每次修改只需要更新版本號的設定,客戶端就會自動請求最新的資料了。

同樣的看了下此versionstrategy的實現是

fixedversionstrategy類,來使

固定版本字串作為資源路徑的字首。

相比其他方式的靜態資源控制,這種方式是我目前發現最簡便的了,尤其是在springboot專案中的使用。在這兩種方式中,我更傾向於方法一的md5方式,可以讓我們不必太過於關注靜態資源問題。當然上述講的兩個實現類,在傳統springmvc專案中也是有的,所以傳統專案也是可以使用的,具體的使用方法大家可以研究研究。

隨筆小記,喜歡幫忙點個贊吧。實現思路來自michael scharhag:

Spring Boot2 0實現微服務呼叫

微服務相互呼叫可避免跨域問題 呼叫兩種方式 1.resttemplate 底層採用httpclient的技術,屬於spring boot,是spring boot 預設採用的rebbon服務呼叫。2.fegin 建議 屬於spring cloud resttemplate 控制器 restcontr...

spring boot 2 0系列筆記 二

之前使用的spring boot 版本一直是1.5.x,spring推出2.0已經有一段時間,個人感覺可以花精力去研究一些變化的新特性,網上的文章很多,我就不一一介紹了,本文主要是用spring boot 2.0構建乙個現在很流行的分布式module專案的demo,位址在本文最後會貼出.下面開始表演...

二 SpringBoot2 0啟動方式

方式一可以將啟動類作為控制器,從而實現啟動並訪問。author 小吉 description springboot2.0啟動方式一 方式二需要在啟動類中加上 componentscan 註解,註解可以配置掃瞄的基礎包,用於指定從哪個包往下掃瞄元件。author 小吉 description spri...