利用filter+maven自动版本号解决前端缓存(非入侵)
原理:利用filter拦截所有前端静态资源,并为前端资源url地址拼接一个版本号参数。做到每一次发布,都会生成一个新的url地址,解决前端缓存问题。同时利用maven打包程序自动为版本配置文件,每一次打包生成一个新的版本号。
配置步骤:
1、配置拦截器filter:
<!--前端资源缓存处理类-->
<filter>
<filter-name>staticCacheFilter</filter-name>
<filter-class>com.qcsy.springboot.filter.CacheVersionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>staticCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
CacheVersionFilter类资源:
package com.qcsy.springboot.filter;
import org.hibernate.internal.util.ConfigHelper;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Optional;
import java.util.Properties;
/**
* Description: 专门用于处理缓存的拦截器
*
* @author qcsy
* @version 1.0 2020/10/15
*/
public class CacheVersionFilter implements Filter {
private final String[] suffixs={".js",".css","jpg","png","jpge"};
private final String versionHeader="scdp_version=";
private static String version="0";
static {
try {
Properties properties =new Properties();
properties.load(new FileInputStream(CacheVersionFilter.class.getClassLoader().getResource("sysconfig.properties").getPath()));
version=properties.getProperty("system.version","0");
}catch (Exception e){
Properties properties =new Properties();
try {
properties.load(new FileInputStream(CacheVersionFilter.class.getClassLoader().getResource("bizconfig.properties").getPath()));
} catch (IOException ex) {
ex.printStackTrace();
}
version=properties.getProperty("system.version","0");
version= Optional.ofNullable(properties.getProperty("system.version")).orElse("0").toString();
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)servletRequest;
HttpServletResponse resp = (HttpServletResponse)servletResponse;
String requestURL = req.getRequestURL().toString();
String queryStr = req.getQueryString();
// 解析静态资源
Boolean isStaticSource=false;
for(String suffix:suffixs){
if(requestURL.toLowerCase().endsWith(suffix)){isStaticSource=true;break;}
}
if(isStaticSource){
String newURL = null;
if(StringUtil.isNotEmpty(queryStr) && queryStr.trim().indexOf(versionHeader) == -1){
newURL = requestURL + "?" + queryStr + "&" +versionHeader+ version;
resp.sendRedirect(newURL);
return;
}
if(StringUtil.isEmpty(queryStr)){
newURL = requestURL + "?" + versionHeader + version;
resp.sendRedirect(newURL);
return;
}
}
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
2、配置版本配置文件:
可以在系统的sysconfig.properties或者bizconfig.properties配置。建议最好在bizconfig.propersties配置
system.version=${system.version}
3、配置maven的 pom.xml让程序打包或者自动编译的时候,生成新的版本号:
添加一个系统版本号的自动时间属性:

<!--系统打包版本号--> <system.version>${maven.build.timestamp}</system.version>
4、最后呈现效果:每一次发布都会重新刷新缓存,如图

6140

被折叠的 条评论
为什么被折叠?



