使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算如何实现海量IoT数据就地处理

1.什么是IoT边缘&#xff1f;Gartner数据显示&#xff0c;到2021年底将有超过50&#xff05;的大型企业部署至少一个边缘计算应用&#xff1b;到2023年底&#xff0c;50&#xff05;以上的大型企业将至少部署6个用于物联网或沉浸式体验的边缘计算应用。工业一体机的售价一般在1…

.propertie文件注释

在.properties文件中注释,前边加#就可以转载于:https://www.cnblogs.com/toSeeMyDream/p/5539322.html

《鸿蒙理论知识01》HarmonyOS概述之技术特性

导读:多种设备之间能够实现硬件互助、资源共享,依赖的关键技术包括分布式软总线、分布式设 备虚拟化、分布式数据管理、分布式任务调度等。 目录 1.分布式软总线 2.分布式设备虚拟化 3.分布式数据管理 4.分布式任务调度

《鸿蒙理论知识02》HarmonyOS开发平台和工具

目录 1.应用和开发工具的演进 2.超 级 终 端 应 用 开 发 面 临 全 新 挑 战

不常用 保存下来

一、数学函数  数学函数主要用于处理数字&#xff0c;包括整型、浮点数等。 ABS(x) 返回x的绝对值   SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数   SELECT CEIL(1.5) -- 返回2 FLOOR(x) 返回小于或等于x的最大整数   SELECT FLOOR(1.5) --…

用Lucene建立搜索索引

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中&#xff0c;以…

《鸿蒙理论知识03》HarmonyOS概述之系统安全

在搭载 HarmonyOS 的分布式终端上,可以保证“正确的人,通过正确的设备,正确地使 用数据”。 通过“分布式多端协同身份认证”来保证“正确的人”。 通过“在分布式终端上构筑可信运行环境”来保证“正确的设备”。 通过“分布式数据在跨终端流动的过程中,对数据进行分类分…

Shell基础学习(六) 流程控制

1、if if的语法格式 if conditon thencommand1command2commandn fi 2、if else if conditon thencommand1command2commandn elsecommand1command2commandn fi 3、if elseif else if conditon thencommand1command2commandn else if conditoncommand1command2commandn elsecomma…

《鸿蒙理论知识04》HarmonyOS概述之系统定义

目录 系统定位 技术架构 系统服务层 框架层 系统定位 HarmonyOS 是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体 娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS 提出了基 于同一套系统能力、适配多种终端形态的分布式理念,…

jQuery on 绑定的事件触发多次

jquery用on绑定事件&#xff0c;在代码执行过程中&#xff0c;可能会遇到多次执行的情况。 解决方案是在on的事件前面加上一个off&#xff0c;再on。 $(#btnBind).off(click).on(click,function () {alert(123); });$("#xxx").off(keydown).focus().on(keydown,funct…

twitter api_Java应用程序上的Twitter API

twitter api是否曾想过将推文附加到Java应用程序&#xff1f; 我为此寻找了最好的API&#xff0c;很幸运&#xff0c;我找到了它&#xff01; http://twitter4j.org/ 一个简单的方法&#xff1a; 我们需要做的第一件事是在您的Twitter帐户中创建一个应用程序&#xff0c;为其授…

《鸿蒙理论知识05》HarmonyOS概述之下载与安装软件

DevEco Studio 支持 Windows 和 macOS 系统,下面将针对两种操作系统的软件安装方式 进行介绍。 目录 Windows 环境 macOS 环境 Windows 环境 运行环境要求 为保证 DevEco Studio 正常运行,建议您的电脑配置满足如下要求:  操作系统:Windows10 64 位  内存:8GB …

网络编程释疑之:单台服务器上的并发TCP连接数可以有多少

曾几何时我们还在寻求网络编程中C10K问题的解决方案&#xff0c;但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。我们先假设单台服务器最多只能支持万级并发连接&#xff0c;其实对绝大多数应用来说已经远远足够了&#xff0c;但是对于一些…

垂直和水平装饰

装饰器模式是在不更改其接口的情况下向对象添加功能的最佳方法之一。 我经常使用可组合装饰器&#xff0c;并且总是会问自己在功能列表必须可配置时如何正确设计它们。 我不确定我的答案是否正确&#xff0c;但是这里有一些值得深思的地方。 公寓&#xff08;1960&#xff09;…

cygwin配置git

对于windows用户来说&#xff0c;使用git bash经常会出现乱码情况&#xff0c;那么一款优质高尚的软件&#xff0c;值得推荐一下了&#xff0c;那就是cygwin 下载cygwin后&#xff0c;在安装过程中&#xff0c;安装git&#xff0c;安装vim编辑器 然后会在安装目录下看到类linux…

《鸿蒙理论知识06》HarmonyOS概述之应用开发基础知识

目录 APP Ability 库文件 资源文件 配置文件 pack.info HAR APP HarmonyOS 的应用软件包以 APP Pack(Application Package)形式发布

C#中FuncT,TResult的用法和Lambda表达式

在C#3.0中引用了Limbda表达式&#xff0c;Limbda表达式实际上就是一个方法&#xff0c;只不过该方法是匿名方法&#xff08;即没有名称的方法&#xff09;代码片段&#xff1a; Func<int,string,string> t(int x, string b) > (x.ToString() b);就等于如下&#xff1…

前端代码规范网址导航(总结)

在大公司代码规范是非常重要的一件事情,多人协作,还有代码评审。所以能写出漂亮的代码非常重要。 这就好比你自己在家,无论是穿大裤衩子,还是背心,甚至是光膀子,都没人管你。但你要出门去约会,就要把最好的一面展现给别人。这是对别人的尊重,也是给自己的背书。所以遵…

SCI/EI期刊投稿 Reply Letter 常用格式总结

SCI/EI期刊投稿Reply Letter常用格式总结整个论文投稿的过程中&#xff0c;会遇到各种问题&#xff0c;需要我们向主编询问或是回复。下面主要总结了responses to the comments&#xff0c;以及催稿信的模板。1、回复信&#xff08;Response Letter&#xff09;在期刊投稿中&am…

rabbitmq 传递文件_RabbitMQ:计划邮件传递

rabbitmq 传递文件本月初&#xff0c;我在ComoRichWeb上的RabbitMQ上做了一个演讲&#xff0c;与会人员提出的一个问题是“是否可以发布一条消息供以后使用&#xff1f;” 我回答说&#xff0c;就我所知&#xff0c;这是不可能的&#xff0c;但是可能会有一些技巧来实现它。 好…