微信公众号更新缓存问题--批量添加版本号

        发现在修改css文件或者js文件重新发布更新公众号后修改的内容没有发生变化,有时又需要手动多刷新几次或者清理微信缓存后才好用,这就造成用户体验不好。
        需要一种重新发布后用户可以实时看到最新的功能,想到一种增加版本号来解决微信缓存问题,编写一个工具类可以在CSS或者JS引用时添加文件最后修改日期的时间戳,这样微信就可以只更新时间戳变化的文件,没有修改的可以继续使用本地缓存的文件,避免不必要的资源请求。

       该工具类可以生成一个新的项目文件夹,运行结束后就可以发布了

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.FileUtils;

public class UpdateVersion {
	// 收集所有的页面文件html
	public static List<File> htmlFile = new ArrayList<File>();

	public static void main(String[] args) {
		updateFile("要修改项目文件夹");
	}

	/**
	 * 遍历跟文件夹并过滤目标文件
	 * 
	 * @param rootFile
	 * @return
	 */
	public static List<File> managerFile(File rootFile) {
		File[] rootFiles = rootFile.listFiles();
		for (File file : rootFiles) {
			if (file.isDirectory()) {
				if(".idea".equals(file.getName())){
					continue;
				}
				managerFile(file);
			} else {
				htmlFile.add(file);
			}
		}
		return htmlFile;
	}
	
	public static void updateFile(String webRootName){
		/*
		 * 获取项目路径
		 */
		String webRoot = "D:/test/"; // 原文件根目录
		File rootDir = new File(webRoot+webRootName);//根据项目的绝对地址获取文件
		if (!rootDir.exists()) {
			return;
		}
		List<File> htmlFile = managerFile(rootDir);// 获取所有的html文件
		/*
		 * 生成全局的版本号(目前我没有使用这种方式,我使用的是每个文件的最后修改时间作为版本号)
		 */
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String versionNum = sdf.format(new Date());
		/*
		 * 循环遍历所有的文件
		 */
		for (File file : htmlFile) {
			String fileName = file.getPath().substring(webRoot.length());
			String filePath = "D:/dst/" + file.getParent().substring(webRoot.length());// 生成目标文件目录

			/*
			 * 创建新目录
			 */
			File fileDir = new File(filePath);
			if (!fileDir.exists()) {
				fileDir.mkdirs();
			}
			try {
				File targetFile = new File("D:/dst/" + fileName);
				/* 
				 * 生成新文件 
				 */
				if (!targetFile.exists()) {
					targetFile.createNewFile();
				}
				if(file.getName().endsWith(".html") && !"index.html".equals(file.getName())){

					System.out.println("要修改的文件:"+file.getName());
					
					BufferedReader reader = new BufferedReader(
							new InputStreamReader(new FileInputStream(file)));// 读取文件
					
					BufferedWriter writer = new BufferedWriter(
							new OutputStreamWriter(new FileOutputStream(targetFile)));
					String line = reader.readLine();
					while (null != line) {

						/*
						 * 给引用的js自动添加版本号,全局版本号
						 */
						String regEx = "(\\s+<script|<script).*(src=\".*\")";
						Pattern p = Pattern.compile(regEx);
						Matcher m = p.matcher(line);
						if (m.find()) {
							String srcStr = m.group(2);
							String dstStr = srcStr
									.substring(0, srcStr.length() - 1)
									+ "?v="
									+ versionNum + "\"";
							line = line.replaceAll(srcStr, dstStr);
						}

						/*
						 * 给引用的css自动添加版本号,文件修改时间最为版本号
						 */
						String linkRegEx = "(\\s+<link|<link).*(href=\".*?\")";
						p = Pattern.compile(linkRegEx);
						m = p.matcher(line);
						if (m.find()) {
							String srcStr = m.group(2);
							System.out.println("  修改前"+srcStr);
							//获取CSS文件,用于获取最后修改时间;targetFileCss.lastModified()获取时间戳
							File targetFileCss = new File(webRoot+webRootName+"/" + srcStr
									.substring(6, srcStr.length() - 1));
							String dstStr = srcStr
									.substring(0, srcStr.length() - 1)
									+ "?v="
									+ targetFileCss.lastModified() + "\"";
							System.out.println("  修改后"+dstStr);
							line = line.replaceAll(srcStr, dstStr);
						}

						/*
						 * 给引用的img自动添加版本号
						 */
						String imageRegEx = ".*<img.*(src=\"https:.*?\")";
						p = Pattern.compile(imageRegEx);
						m = p.matcher(line);
						if (m.find()) {
							String srcStr = m.group(1);
							System.out.println(srcStr);
							String dstStr = srcStr
									.substring(0, srcStr.length() - 1)
									+ "?v="
									+ versionNum + "\"";
							line = line.replaceAll(srcStr, dstStr);
						}
						writer.write(line + "\r\n");
						line = reader.readLine();
					}

					
					reader.close();
					writer.close();
				}else{
					System.out.println("不需要修改的文件:"+file.getName());
					FileUtils.copyFile(file, targetFile);
				}
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值