猶記畢業第一年時,公司每次發布完成後,都會在乙個群裡通知【版本更新,各部門清理快取,有問題及時反饋】之類的話。歸根結底就是資源快取的問題,瀏覽器會將請求到的靜態資源,如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
,**如下:
@controlleradvicepublic
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...