通过添加listener
在服务启动时将html、ftl等静态页面引用的js版本号整体替换
1、创建listener
package com.XXX.XXX.listener.CleanPageCacheListener
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintWriter;
/**
* @ Author :Insect
* @ Date :Created in 9:34 2021-6-11
* @ Description:
* @ Modified By:
*/
public class CleanPageCacheListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
try {
// 获取项目目录下的ftl 和 js 文件
ServletContext servletContext = servletContextEvent.getServletContext();
String realPath = servletContext.getRealPath("WEB-INF/ftl/member/workbench.ftl");
File file = new File(realPath);
Long fileLength = file.length();
byte[] fileContext = new byte[fileLength.intValue()];
FileInputStream in = null;
PrintWriter out = null;
in = new FileInputStream(realPath);
in.read(fileContext);
// 避免出现中文乱码
String str = new String(fileContext, "utf-8");//字节转换成字符
str = replaceStr(str);
out = new PrintWriter(realPath, "utf-8");//写入文件时的charset
out.write(str);
out.flush();
out.close();
in.close();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
private String replaceStr(String str){
// 完整写法
String case1 = ".js\"></script>";
// 懒汉写法
String case2 = ".js\"/>";
// 已经生成过,解决项目重启的问题
String case3 = ".js\\?v=.+?\"></script>";
long version = System.currentTimeMillis();
String replace = ".js?v=" + version + "\"></script>";
//注意最后一个replaceAll 使用的为正则匹配
return str.replace(case1, replace).replace(case2, replace).replaceAll(case3, replace);
}
}
2、配置web.xml
<listener>
<listener-class>com.XXX.XXX.listener.CleanPageCacheListener
</listener-class>
</listener>
3、重启服务
自动更新html、ftl中的js版本号
效果展示