国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制詳解

2024-07-14 08:42:58
字體:
供稿:網(wǎng)友

寫在最前面

猶記畢業(yè)第一年時,公司每次發(fā)布完成后,都會在一個群里通知【版本更新,各部門清理緩存,有問題及時反饋】之類的話。歸根結(jié)底就是資源緩存的問題,瀏覽器會將請求到的靜態(tài)資源,如JS、CSS等文件緩存到用戶本地,當(dāng)用戶再次訪問時就不需要再次請求這些資源了,以此也是提升了用戶體驗。但是也正是因為這些資源緩存,導(dǎo)致客戶端的靜態(tài)文件往往不是當(dāng)前最新版本。后來有同事增加了時間戳、隨機(jī)數(shù)等,確實這也解決了客戶端緩存的問題,但是卻又帶來了新的麻煩,導(dǎo)致每次訪問都要請求服務(wù)器,無形中增加了服務(wù)器的壓力。

那么有什么辦法可以讓客戶端當(dāng)需要更新時才去請求,不需更新就不請求嗎?當(dāng)然有,實現(xiàn)方式很多種,像前端實現(xiàn),webjars實現(xiàn)等都可以,但是麻煩還是麻煩,太燒腦。介紹一種Spring自身提供的方式,也是我目前所應(yīng)用的方式,ResourceUrlProvider。

ResourceUrlProvider的實現(xiàn)效果有兩種,大家可以在后文中看到。下面話不多說了,來一起看看詳細(xì)的介紹吧

第一種、MD5實現(xiàn)

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

spring:  resources: chain:  strategy:  content:   enabled: true   paths: /**

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

<script th:src="${@mvcResourceUrlProvider.getForLookupPath('/mods/admin/login.js')}"></script>

如果您使用的模板引擎無法直接訪問Spring bean,則可以將ResourceUrlProvider 添加到Spring中。使用ControllerAdvice,代碼如下:

@ControllerAdvicepublic class ControllerConfig { @Autowired ResourceUrlProvider resourceUrlProvider; @ModelAttribute("urls") public ResourceUrlProvider urls() {  return this.resourceUrlProvider; }}

然后在頁面上通過下述代碼引用:

<script th:src="${urls.getForLookupPath('/mods/admin/login.js')}"></script>

此方法應(yīng)適用于支持方法調(diào)用的所有模板引擎。

下面我們來看看具體的實現(xiàn)效果吧,前臺訪問后html頁面顯示為:

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

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

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

第二種、版本號實現(xiàn)

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

spring:  resources: chain:  strategy:  fixed:   enabled: true   paths: /mods/admin/*.js   version: 20181128

后續(xù)操作同上,此時我們看下頁面顯示的效果:

<script src="/20181128/mods/admin/login.js"></script>

在文件路徑的最前面增加了版本號,當(dāng)我們每次修改只需要更新版本號的設(shè)置,客戶端就會自動請求最新的數(shù)據(jù)了。

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

總結(jié)

相比其他方式的靜態(tài)資源控制,這種方式是我目前發(fā)現(xiàn)最簡便的了,尤其是在SpringBoot項目中的使用。在這兩種方式中,我更傾向于方法一的MD5方式,可以讓我們不必太過于關(guān)注靜態(tài)資源問題。當(dāng)然上述講的兩個實現(xiàn)類,在傳統(tǒng)SpringMVC項目中也是有的,所以傳統(tǒng)項目也是可以使用的,具體的使用方法大家可以研究研究。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 浪卡子县| 和平区| 青龙| 波密县| 宁城县| 海门市| 青阳县| 临西县| 道孚县| 新巴尔虎左旗| 桓仁| 昌乐县| 渑池县| 林口县| 理塘县| 长治县| 闵行区| 库尔勒市| 遵义市| 丹寨县| 饶平县| 内江市| 砀山县| 金塔县| 红桥区| 贺兰县| 张北县| 通州市| 汤阴县| 即墨市| 承德市| 昌邑市| 阿克陶县| 无极县| 土默特右旗| 礼泉县| 大邑县| 和田市| 临江市| 江都市| 祁门县|