写在最前面

犹记毕业第一年时,公司每次发布完成后,都会在一个群里通知【版本更新,各部门清理缓存,有问题及时反馈】之类的话。归根结底就是资源缓存的问题,浏览器会将请求到的静态资源,如JS、CSS等文件缓存到用户本地,当用户再次访问时就不需要再次请求这些资源了,以此也是提升了用户体验。但是也正是因为这些资源缓存,导致客户端的静态文件往往不是当前最新版本。后来有同事增加了时间戳、随机数等,确实这也解决了客户端缓存的问题,但是却又带来了新的麻烦,导致每次访问都要请求服务器,无形中增加了服务器的压力。

那么有什么办法可以让客户端当需要更新时才去请求,不需更新就不请求吗?当然有,实现方式很多种,像前端实现,webjars实现等都可以,但是麻烦还是麻烦,太烧脑。介绍一种Spring自身提供的方式,也是我目前所应用的方式,ResourceUrlProvider

ResourceUrlProvider的实现效果有两种,大家可以在后文中看到。

第一种、MD5实现

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

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

其次,如果您恰巧和我一样使用Thymeleaf作为模板引擎,则可以和我一样使用@bean语法直接从模板访问ResourceUrlProvider bean。

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

如果您使用的模板引擎无法直接访问Spring bean,则可以将ResourceUrlProvider 添加到Spring中。使用ControllerAdvice,代码如下:

@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>

此方法应适用于支持方法调用的所有模板引擎。

下面我们来看看具体的实现效果吧,前台访问后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

SpringBoot2.0实现静态资源版本控制的更多相关文章

  1. Django + Vue cli 3.0 访问静态资源问题

    [问题背景] 用Vue clie 3.0的搭建得框架把我坑死了,在打包后,调用不到静态资源js,css,mp3等 [问题原因] vue cli 3.0打包后,dist目录下没有static目录,而Dj ...

  2. webpack htmlWebpackPlugin 静态资源 版本控制

    plugins: [ new webpack.optimize.UglifyJsPlugin({ // 压缩webpack 后生成的代码较长时间,通常推到生产环境中才使用 compress:{ war ...

  3. gulp 静态资源版本控制

    package.json { "name": "gulp", "version": "0.0.1", "des ...

  4. spring mvc 静态资源版本控制

    spring bean 文件中增加 <bean class="cn.zno.smse.common.context.VersionServletContext">< ...

  5. SpringMVC+FreeMarker实现静态资源文件自动添加版本号(md5)

    近日切换java开发,开始学习springframework.在实现静态资源文件自动计算版本号的实例时,因为不熟悉框架,走了不少弯路,好在最终解决了问题.这里写篇文章记录一下实现,也希望对大家有些用处 ...

  6. gulp之静态资源防缓存处理

    最近,因为校友网项目开始有些规模了.开始就要考虑对静态资源进行工程自动化的管理.一讲到前端的自动化工具,大家或许都会想到Grunt,Gulp,或者百度的FIS.这三个都有各自的特点,大家可以依据自己的 ...

  7. springMVC静态资源访问

    springMVC默认是访问不到静态资源的,如css,js等,需要在xml里进行配置 保证已经配置好了 web.xml, <!-- Spring MVC servlet --> <s ...

  8. (二)SpringBoot2.0基础篇- 静态资源的访问及Thymeleaf模板引擎的使用

    一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...

  9. springboot2.0+ 使用拦截器导致静态资源被拦截

    在spring1.0+的版本中,配置拦截器后是不会拦截静态资源的.其配置如下: @Configuration public class WebMvcConfig extends WebMvcConfi ...

随机推荐

  1. Django框架基于session的登录/注销实现

    博主最近想基于Django框架开发一个测试平台,第一版先实现查看下载自动化的测试报告文件 第一步:前端框架 网上选择一款开源boostrap的前端框架 AdminLTE,这里给个链接  https:/ ...

  2. Android之水波纹点击效果(RippleView)

    Android5.0后各种炫的效果纷纷出来,写这篇博客主要是讲的是按钮点击效果带有的水波纹(波浪式). 当然我写的这个是自定义来实现的,在低版本(5.0一下)也可以实现点击效果.看看效果图: 上图可看 ...

  3. 51nod1347思维

    1347 旋转字符串 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 S[0...n-1]是一个长度为n的字符串,定义旋转函数Left(S)=S[1… ...

  4. 关于 XML 头声明和standalone 的解释

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <roo ...

  5. web漏洞扫描工具集合

    最好用的开源Web漏洞扫描工具梳理 链接:www.freebuf.com/articles/web/155209.html 赛门铁克2017年互联网安全威胁报告中提出在他们今年扫描的网站中,有76%都 ...

  6. BZOJ1074 [SCOI2007]折纸origami

    我们先看每个点可能从哪些点折过来的,2^10枚举对角线是否用到. 然后再模拟折法,查看每个点是否满足要求. 恩,计算几何比较恶心,还好前几天刚写过一道更恶心的计算几何,点类直接拷过来2333. /** ...

  7. UVA 11624 Fire! bfs 难度:0

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  8. 2018.12.21 Cmos- RF

    1 PSK 趋肤效应 50欧匹配 smith s参数 :在datasheet里面会有 Information coding Bluetooth : Continous Variable Slope D ...

  9. openssl RSA证书签发命令

    一.生成根证书 1. 创建根证书私钥 openssl genrsa -out ca.key 2048 2. 创建根证书申请文件 openssl req -new -key ca.key -out ca ...

  10. 最新解决 Ubuntu16.04 和 win10 双系统时间同步问题 (设置为 UTC 时间)

    最近在电脑上安装了 Ubuntu16.04 和  Win10 双系统, 开机后发现电脑的开机系统出现了问题,不知道怎么搞的总是会出现8个小时的误差,在网上查了好多文章发现网上的大部分方法都是比较过时的 ...