javascript
使用Spring MVC进行资源版本控制
提供靜態資源時,通常的做法是將某種版本信息附加到資源URL。 這使瀏覽器可以無限期地緩存資源。 每當資源的內容更改時,URL中的版本信息也會更改。 更新的URL會強制客戶端瀏覽器放棄緩存的資源,并從服務器重新加載最新的資源版本。
使用Spring,只需兩個簡單的步驟即可配置版本化的資源URL。 在這篇文章中,我們將看到它是如何工作的。
提供版本化網址
首先,我們需要告訴Spring應該通過版本化的URL訪問資源。 這是在資源處理程序MVC配置中完成的:
@Configuration public?class?MvcApplication?extends?WebMvcConfigurerAdapter?{@Overridepublic?void?addResourceHandlers(ResourceHandlerRegistry?registry)?{VersionResourceResolver?versionResourceResolver?=?new?VersionResourceResolver().addVersionStrategy(new?ContentVersionStrategy(),?"/**");registry.addResourceHandler("/javascript/*.js").addResourceLocations("classpath:/static/").setCachePeriod(60?*?60?*?24?*?365)?/*?one?year?*/.resourceChain(true).addResolver(versionResourceResolver);}... }在這里,我們為位于類路徑內名為static的文件夾中JavaScript文件創建資源處理程序。 這些JavaScript文件的緩存時間設置為一年。 重要的部分是VersionResourceResolver ,它支持帶有版本信息的資源URL。 VersionStrategy用于獲取資源的實際版本。
在此示例中,我們使用ContentVersionStrategy 。 此VersionStrategy實現從資源的內容計算MD5哈希并將其附加到文件名。
例如:假設我們在classpath:/ static /目錄中有一個JavaScript文件test.js。 test.js的MD5哈希為69ea0cf3b5941340f06ea65583193168。
現在,我們可以將請求發送至:
/javascript/test-69ea0cf3b5941340f06ea65583193168.js它將解析為classpath:/static/test.js。
請注意,仍然可以在沒有MD5哈希的情況下請求資源。 因此,此請求也適用:
/javascript/test.js另一個VersionStrategy實現是FixedVersionStrategy 。 FixedVersionStrategy使用固定版本字符串作為前綴添加到資源路徑。
例如:
/v1.2.3/javascript/test.js生成版本化的URL
現在,我們需要確保應用程序生成的資源URL包含MD5哈希。
一種解決方法是使用ResourceUrlProvider 。 使用ResourceUrlProvider,可以將資源URL(例如/javascript/test.js)轉換為版本化的URL(例如/javascript/test-69ea0cf3b5941340f06ea65583193168.js)。 使用MVC配置會自動聲明ID為mvcResourceUrlProvider的ResourceUrlProvider bean。
如果您將Thymeleaf用作模板引擎,則可以使用@bean語法直接從模板訪問ResourceUrlProvider bean。
例如:
<script?type="application/javascript"th:src="${@mvcResourceUrlProvider.getForLookupPath('/javascript/test.js')}"> </script>如果使用的模板引擎不能直接訪問Spring Bean,則可以將ResourceUrlProvider Bean添加到模型屬性中。 使用ControllerAdvice ,可能看起來像這樣:
@ControllerAdvice public?class?ResourceUrlAdvice?{@InjectResourceUrlProvider?resourceUrlProvider;@ModelAttribute("urls")public?ResourceUrlProvider?urls()?{return?this.resourceUrlProvider;} }然后,在視圖內部,我們可以使用urls模型屬性訪問ResourceUrlProvider:
<script?type="application/javascript"?th:src="${urls.getForLookupPath('/javascript/test.js')}"> </script>此方法應與所有支持方法調用的模板引擎一起使用。
生成版本化URL的另一種方法是使用ResourceUrlEncodingFilter 。 這是一個Servlet篩選器,它重寫HttpServletResponse.encodeURL()方法以生成版本化的資源URL。
要使用ResourceUrlEncodingFilter,我們只需要向配置類中添加一個額外的bean:
@SpringBootApplication public?class?MvcApplication?extends?WebMvcConfigurerAdapter?{@Overridepublic?void?addResourceHandlers(ResourceHandlerRegistry?registry)?{//?same?as?before?..}@Beanpublic?ResourceUrlEncodingFilter?resourceUrlEncodingFilter()?{return?new?ResourceUrlEncodingFilter();}... }如果您使用的模板引擎調用了響應encodeURL()方法,則版本信息將自動添加到URL。 這將適用于JSP,Thymeleaf,FreeMarker和Velocity。
例如:通過Thymeleaf,我們可以使用標準的@ {..}語法來創建URL:
<script?type="application/javascript"?th:src="@{/javascript/test.js}"></script>這將導致:
<script?type="application/javascript"?src="/javascript/test-69ea0cf3b5941340f06ea65583193168.js"> </script>摘要
將版本信息添加到資源URL是最大化瀏覽器緩存的常見做法。 使用Spring,我們只需要定義一個VersionResourceResolver和一個VersionStrategy即可提供版本化的URL。 在模板引擎內部生成版本化URL的最簡單方法是使用ResourceUrlEncodingFilter。
如果標準的VersionStrategy實現不符合您的要求,則可以創建我們自己的VersionStrategy實現。
- 您可以在GitHub上找到完整的示例源代碼。
翻譯自: https://www.javacodegeeks.com/2015/09/resource-versioning-with-spring-mvc.html
總結
以上是生活随笔為你收集整理的使用Spring MVC进行资源版本控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓测屏幕按哪几个键(安卓测屏幕)
- 下一篇: jsf集成spring_Spring和J