最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年11月29日 10:04:57   作者:小賣(mài)鋪的老爺爺  
這篇文章主要給大家介紹了關(guān)于Spring Boot2.0實(shí)現(xiàn)靜態(tài)資源版本控制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

寫(xiě)在最前面

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

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

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

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

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

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

其次,如果您恰巧和我一樣使用Thymeleaf作為模板引擎,則可以和我一樣使用@bean語(yǔ)法直接從模板訪(fǎng)問(wèn)ResourceUrlProvider bean。

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

如果您使用的模板引擎無(wú)法直接訪(fǎng)問(wèn)Spring bean,則可以將ResourceUrlProvider 添加到Spring中。使用ControllerAdvice,代碼如下:

@ControllerAdvice
public class ControllerConfig {

 @Autowired
 ResourceUrlProvider resourceUrlProvider;

 @ModelAttribute("urls")
 public ResourceUrlProvider urls() {
  return this.resourceUrlProvider;
 }

}

然后在頁(yè)面上通過(guò)下述代碼引用:

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

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

下面我們來(lái)看看具體的實(shí)現(xiàn)效果吧,前臺(tái)訪(fǎng)問(wèn)后html頁(yè)面顯示為:

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

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

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

第二種、版本號(hào)實(shí)現(xiàn)

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

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

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

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

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

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

總結(jié)

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

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Spring Boot無(wú)縫集成MongoDB

    Spring Boot無(wú)縫集成MongoDB

    這篇文章主要介紹了Spring Boot無(wú)縫集成MongoDB的相關(guān)知識(shí),本文涉及到MongoDB的概念和nosql的應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2017-04-04
  • 使用RestTemplate訪(fǎng)問(wèn)https實(shí)現(xiàn)SSL請(qǐng)求操作

    使用RestTemplate訪(fǎng)問(wèn)https實(shí)現(xiàn)SSL請(qǐng)求操作

    這篇文章主要介紹了使用RestTemplate訪(fǎng)問(wèn)https實(shí)現(xiàn)SSL請(qǐng)求操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java對(duì)象轉(zhuǎn)Json,關(guān)于@JSONField對(duì)象字段重命名和順序問(wèn)題

    Java對(duì)象轉(zhuǎn)Json,關(guān)于@JSONField對(duì)象字段重命名和順序問(wèn)題

    這篇文章主要介紹了Java對(duì)象轉(zhuǎn)Json,關(guān)于@JSONField對(duì)象字段重命名和順序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 淺談java面向?qū)ο蟮臄?shù)組化信息處理

    淺談java面向?qū)ο蟮臄?shù)組化信息處理

    下面小編就為大家?guī)?lái)一篇淺談java面向?qū)ο蟮臄?shù)組化信息處理。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • SpringMVC中的ConversionServiceExposingInterceptor工具類(lèi)解析

    SpringMVC中的ConversionServiceExposingInterceptor工具類(lèi)解析

    這篇文章主要介紹了SpringMVC中的ConversionServiceExposingInterceptor工具類(lèi)解析,ConversionServiceExposingInterceptor是Spring MVC的一個(gè)HandlerInterceptor,用于向請(qǐng)求添加一個(gè)屬性,需要的朋友可以參考下
    2023-12-12
  • eclipse端口被占用問(wèn)題的解決方法

    eclipse端口被占用問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于eclipse端口被占用問(wèn)題的解決方法,文中通過(guò)圖文以及命令代碼介紹的非常詳細(xì),對(duì)遇到這個(gè)問(wèn)題的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • springBoot @Enable* 注解的使用

    springBoot @Enable* 注解的使用

    這篇文章主要介紹了springBoot @Enable* 注解的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • java基礎(chǔ)的詳細(xì)了解第二天

    java基礎(chǔ)的詳細(xì)了解第二天

    這篇文章對(duì)Java編程語(yǔ)言的基礎(chǔ)知識(shí)作了一個(gè)較為全面的匯總,在這里給大家分享一下。需要的朋友可以參考,希望能給你帶來(lái)幫助
    2021-08-08
  • Java實(shí)現(xiàn)度分秒坐標(biāo)轉(zhuǎn)十進(jìn)制度

    Java實(shí)現(xiàn)度分秒坐標(biāo)轉(zhuǎn)十進(jìn)制度

    隨著技術(shù)的發(fā)展,十進(jìn)制度因其精確性和便捷性在現(xiàn)代應(yīng)用中越來(lái)越受到青睞,下面我們就來(lái)看看如何使用Java實(shí)現(xiàn)度分秒坐標(biāo)轉(zhuǎn)十進(jìn)制度吧
    2024-12-12
  • java鏈表的常見(jiàn)簡(jiǎn)單面試算法題詳解

    java鏈表的常見(jiàn)簡(jiǎn)單面試算法題詳解

    文章總結(jié):本文主要介紹了單鏈表的基本操作,包括頭插法、尾插法、鏈表翻轉(zhuǎn)、鏈表成環(huán)判斷、成環(huán)位置判斷、成環(huán)長(zhǎng)度判斷,以及有序鏈表的合并,通過(guò)實(shí)例和代碼示例,詳細(xì)講解了每種操作的原理和實(shí)現(xiàn)方法
    2025-01-01

最新評(píng)論

邹平县| 海宁市| 辉县市| 林西县| 苏尼特右旗| 乌兰察布市| 广饶县| 麟游县| 安岳县| 兰州市| 陆丰市| 鄯善县| 金秀| 随州市| 博兴县| 高陵县| 鸡东县| 双江| 湘潭市| 西贡区| 鸡西市| 庆云县| 峨眉山市| 昌黎县| 东平县| 新郑市| 绵阳市| 博白县| 南乐县| 扶沟县| 丰城市| 远安县| 泰顺县| 谢通门县| 阜新| 尼木县| 都江堰市| 广德县| 昔阳县| 稻城县| 博兴县|