springBoot防止js等静态资源缓存

一. 引入

在java web编程中,页面引入js脚本,css样式等是避免不了的,但是在开发调试中,往往不想页面对js,css等进行缓存,那么有的人会设置浏览器禁用一切缓存,显然不是最好的解决办法,常常我们会在引入静态资源的末尾加上时间戳,如果以前的jsp页面,就很好加的,直接<%=new Date()%>就ok了,但是对于spring boot项目来说,用了模板引擎,页面都是html的,不能使用jsp这种方式了,那么接下来就说说怎样解决这种问题。

二. 解决方法

  1. 我们先来说说这种直接在后面加随机数方式的弊端,由于随机数(时间戳)每次请求都是不一样的,这样浏览器就不会使用缓存,以至于每次都会请求服务器资源,浪费了服务器资源。
  2. 使用资源名-md5方式:这种方式的好处就是只要更改了静态资源,则请求后就会自动获取最新的资源文件,若资源文件没有更改,浏览器还会使用缓存文件,先看看效果吧:

Alt text

红线标注的就是请求的结果,原本资源文件是:menu.js,通过变换后成了:menu-0621f03970063a0fcadb2fcdc61a950f.js

  1. 配置

(1). 新建ResourceUrlProviderControl .java类

1
2
3
4
5
6
7
8
9
10
11
@ControllerAdvice
public class ResourceUrlProviderControl {
@Autowired
private ResourceUrlProvider resourceUrlProvider;

@ModelAttribute("urls")
public ResourceUrlProvider urls() {
System.out.println("---ResourceUrlProvider---");
return this.resourceUrlProvider;
}
}

(2)在配置文件中配置一下:

1
2
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**

(3)在需要使用资源-md5方式的引入文件中配置如下:
原来:
修改后:

注:如果mvc资源配置中静态资源文件使用了代码方式进行配置了,那么(2)中的方式可能是无效的,那么应该采用底下的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class MVCConfig implements WebMvcConfigurer{
/**
* 配置访问静态文件
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.resourceChain(false)
.addResolver(new VersionResourceResolver()
.addContentVersionStrategy("/**"));
}
}

说白了也就是:

1
2
3
4
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**

如果你的配置文件中有了上面的两句,那么配置资源-md5方式就直接使用配置方式,如果是通过代码进行配置的,那么资源-md5方式也要用代码方式进行配置,博主亲测,两种方式交叉使用,没有效果的。

最后,为了让静态的html页面在开发时修改后,不用重启项目刷新即可看到修改后的效果,可以在application.properties中配置一句:
spring.thymeleaf.cache=false
即可。