写在最前面

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

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

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

第一种、MD5实现

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

spring:

resources:

chain:

strategy:

content:

enabled: true

paths: /**

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

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

@ControllerAdvicepublic classControllerConfig {

@Autowired

ResourceUrlProvider resourceUrlProvider;

@ModelAttribute("urls")publicResourceUrlProvider urls() {return this.resourceUrlProvider;

}

}

然后在页面上通过下述代码引用:

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

下面我们来看看具体的实现效果吧,前台访问后html页面显示为:

注意:如果你的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

后续操作同上,此时我们看下页面显示的效果:

在文件路径的最前面增加了版本号,当我们每次修改只需要更新版本号的设置,客户端就会自动请求最新的数据了。

同样的看了下此VersionStrategy的实现是FixedVersionStrategy类,来使固定版本字符串作为资源路径的前缀。

总结

相比其他方式的静态资源控制,这种方式是我目前发现最简便的了,尤其是在SpringBoot项目中的使用。在这两种方式中,我更倾向于方法一的MD5方式,可以让我们不必太过于关注静态资源问题。当然上述讲的两个实现类,在传统SpringMVC项目中也是有的,所以传统项目也是可以使用的,具体的使用方法大家可以研究研究。

随笔小记,喜欢帮忙点个赞吧。实现思路来自Michael Scharhag:https://www.mscharhag.com/spring/resource-versioning-with-spring-mvc

thymeleaf随机数_SpringBoot2.0实现静态资源版本控制相关推荐

  1. SpringBoot2.0实现静态资源版本控制

    写在最前面 犹记毕业第一年时,公司每次发布完成后,都会在一个群里通知[版本更新,各部门清理缓存,有问题及时反馈]之类的话.归根结底就是资源缓存的问题,浏览器会将请求到的静态资源,如JS.CSS等文件缓 ...

  2. 关于thymeleaf配置语法运用 以及 静态资源问题总结 2021-06-08

    在使用springBoot的时候一般用templates的包来放置静态资源,对于这个包来说它很特殊,这个包它需要导入thymeleaf的依赖才可以用它来和前后端做交互,下面将介绍一下它的使用方法: 导 ...

  3. thymeleaf引用图片_SpringBoot访问静态资源(图片、html)以及整合thymeleaf 注意点

    static和templates 是springboot默认创建的文件夹,static中放静态页面,而templates中放动态页面 存放在static目录下,浏览器可以直接访问 http://loc ...

  4. 浏览器无法加载网页静态资源

    浏览器打开网页一直报错Resource interpreted as Document but transferred with MIME type application/json,以及疯狂报错Un ...

  5. nginx ruoyi 配置静态资源服务

    前言 nginx version: nginx/1.18.0 CentOS Linux release 7.6.1810 (Core) ruoyi 4.6.0 需求 静态资源目录:/data/ruoy ...

  6. Spring Boot第八篇-关于web静态资源的整合

    1.环境:JDK+idea+spring boot2.63 2.打开spring-factories(相关介绍见第七篇) 找到WebMvc的自动配置文件,打开见源码... 源码中有一个addResou ...

  7. Thymeleaf——访问静态资源(static)解决方案

    官方文档 https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#server-root-relative-urls 解决方案 ...

  8. Spring Boot和Thymeleaf:重新加载模板和静态资源,而无需重新启动应用程序

    Thymeleaf是围绕自然模板的概念设计的,该模板允许进行静态原型制作:模板逻辑不会影响用作原型的模板. 尽管这是一项很棒的技术,但您可能还希望在运行的Spring Boot应用程序中查看结果,而不 ...

  9. SpringBoot整合Thymeleaf模板引擎以及静态资源的访问

    SpringBoot整合Thymeleaf模板引擎静态资源访问的配置 Thymeleaf是一个现代服务器端Java模板引擎,适用于Web和独立环境,能够处理HTML,XML,JavaScript,CS ...

最新文章

  1. 实战|基于图割算法的木材表面缺陷图像分析
  2. 查看Unix/Linux的CPU个数和内存大小,系统位数(转载)
  3. c语言指向常量的指针和常量指针
  4. 译:9.使用Redis进行消息传递
  5. java 接口强制转换_三分钟学习Java泛型中T、E、K、V、?的含义
  6. 三种传递gRPC动态参数方式的使用体验
  7. caffe安装_【开源框架】caffe图像分类从模型自定义到测试
  8. 【Python 04】Python开发环境概述
  9. 一维稳态导热的数值计算c语言,传热传质上机实习题(参考资料C语言)
  10. ERROR: function group_concat(character varying) does not exist
  11. 深入了解基于容器的红帽PaaS和OpenShift
  12. 指纹识别算法c++实现
  13. HP服务器raid卡型号b110i安装2008R2认不到硬盘缺少硬盘驱动
  14. js 金额格式化 和 转成人民币大写金额形式
  15. 小窍门:简历邮箱格式的正确写法,个人简历怎么发送到邮箱?
  16. 4个工具,个个都是精品!修复图片视频画质超好用
  17. 微信支付异常(“应答的微信支付签名验证失败“)记录
  18. 【安卓学习之第三方库】 人脸识别SDK
  19. 骨头镇 BoneTown 破解+菜单汉化补丁
  20. qrcode.js 生成二维码包含logo和背景图片及IE下载二维码

热门文章

  1. 【JavaScript】关于delete
  2. Android上传文件至服务器
  3. Cannot get a connection, pool error Timeout waiting for idle object (获取不到数据库连接)...
  4. 决定你是富人还是穷人的12条定律
  5. jsp 中select 下拉选择框 el 三元运算符 如何选中与不选中
  6. python解压缩gz文件_使用python解压缩.gz文件的一部分
  7. 一致性hash算法虚拟节点_一致性 Hash 算法
  8. linux 取消nologin_Linux中nologin的应用 转
  9. ae在哪里直接复制合成_AE模板里修改复制的合成如何不影响原先的合成?
  10. python实现表格_Python 自由定制表格的实现示例