犹记毕业第一年时,公司每次发布完成后,都会在一个群里通知【版本更新,各部门清理缓存,有问题及时反馈】之类的话。归根结底就是资源缓存的问题,浏览器会将请求到的静态资源,如JS、CSS等文件缓存到用户本地,当用户再次访问时就不须要再次请求这些资源了,以此也是提高了用户体验。可是也正是由于这些资源缓存,致使客户端的静态文件每每不是当前最新版本。后来有同事增长了时间戳、随机数等,确实这也解决了客户端缓存的问题,可是却又带来了新的麻烦,致使每次访问都要请求服务器,无形中增长了服务器的压力。html
那么有什么办法可让客户端当须要更新时才去请求,不需更新就不请求吗?固然有,实现方式不少种,像前端实现,webjars实现等均可以,可是麻烦仍是麻烦,太烧脑。介绍一种Spring自身提供的方式,也是我目前所应用的方式,ResourceUrlProvider。前端
ResourceUrlProvider的实现效果有两种,你们能够在后文中看到。java
首先在application.yml或者application.properties中增长配置文件web
spring:
resources:
chain:
strategy:
content:
enabled: true
paths: /**
其次,若是您恰巧和我同样使用Thymeleaf做为模板引擎,则能够和我同样使用@bean语法直接从模板访问ResourceUrlProvider bean。
spring
<script th:src="${@mvcResourceUrlProvider.getForLookupPath('/mods/admin/login.js')}"></script>
若是您使用的模板引擎没法直接访问Spring bean,则能够将ResourceUrlProvider 添加到Spring中。使用ControllerAdvice,代码以下:api
@ControllerAdvice public class ControllerConfig { @Autowired ResourceUrlProvider resourceUrlProvider; @ModelAttribute("urls") public ResourceUrlProvider urls() { return this.resourceUrlProvider; } }
而后在页面上经过下述代码引用:浏览器
<script th:src="${urls.getForLookupPath('/mods/admin/login.js')}"></script>
此方法应适用于支持方法调用的全部模板引擎。spring-mvc
下面咱们来看看具体的实现效果吧,前台访问后html页面显示为:缓存
<script src="/mods/admin/login-96d770c87905659930c9786eaa08d710.js"></script>
注意:若是你的js文件没有修改,或者修改没重启,MD5的值可能不会改变,当你重启服务后你会看到你修改事后的文件MD5也随之改变了。服务器
简单看了下源代码,MD5的计算是经过 ContentVersionStrategy 这个类实现的。此VersionStrategy实现根据资源的内容计算MD5哈希值,并将其附加到文件名后面,也就是你不改变内容MD5值是不会变的哦,一度让我觉得这种方法有BUG(。•ˇ‸ˇ•。)。
一样在application.yml或者application.properties中增长配置文件
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:https://www.mscharhag.com/spring/resource-versioning-with-spring-mvc