js缓存处理+动态添加版本号的最优方案(个人理解)

通过添加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版本号

效果展示

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值