解决jsp文件的缓存问题

1、背景说明

  项目是比较传统的SSM项目,页面是jsp文件,前端的逻辑js代码包括css文件单独拿出去了,

  在jsp中设置禁用缓存是不明智的,首先缓存是有必要的,只有当文件变化时,才应该重新拉取最新的文件

  再者,即便在jsp中禁用了缓存,那他外联的资源文件依然会有缓存

2、解决办法

  为了最大限度的使用缓存,同时避免客户端的无效缓存,我编写了一个工具类,再每次发布时,执行该工具类

  该工具主要是计算资源的文件名,大小、最后更新时间,生成hash,加载文件的访问链接参数上。代码如下:

 1 package com.autobio.site;
 2
 3 import com.autobio.site.common.utils.FileUtils;
 4 import org.springframework.util.DigestUtils;
 5 import java.io.File;
 6 import java.io.IOException;
 7 import java.util.List;
 8
 9 /**
10  * @author niushijie
11  * @datetime 2019-07-12 10:49
12  * @function 静态资源更新hash标识
13  **/
14 public class RefreshAssetsHash {
15     public static void main(String[] args) throws IOException {
16         System.out.println("开始更新jsp文件的hash值-->");
17         System.out.println("被更新的文件如下: ");
18         File file = new File("source/src/main/webapp/WEB-INF/views/modules");
19         updateFileHash(file);
20         System.out.println("<--结束更新jsp文件的hash值");
21     }
22
23     private static void updateFileHash(File file) throws IOException {
24         if (file.isDirectory()) {
25             File[] files = file.listFiles();
26             File headJsp = new File("source/src/main/webapp/WEB-INF/views/include/head.jsp");
27
28             for (File f : files) {
29                 if (f.isDirectory()){
30                     updateFileHash(f);
31                 }else{
32                     calc(f);
33                 }
34             }
35             calc(headJsp);
36         }
37
38     }
39
40     private static void calc(File f) throws IOException {
41         List<String> lines = FileUtils.readLines(f);
42         boolean isUpdated = false;
43         for (int i=0;i<lines.size();i++) {
44             String line = lines.get(i);
45             // 只更新head部分
46             if (line.contains("</head>")){
47                 break;
48             }
49             if (line.contains("${assets}")&&(line.contains("href")||line.contains("src"))){
50                 String temp = line.substring(line.lastIndexOf("}")+1);
51                 // jsp文件中的完整路径
52                 String path = temp.substring(0, temp.indexOf("\""));
53                 // 原始Hash值
54                 String oldHash = null;
55                 // 文件的路径(去除Hash的结果)
56                 String filePath = path;
57                 if (path.contains("?")){
58                     oldHash = path.substring(path.indexOf("?")+1);
59                     filePath = path.substring(0, path.indexOf("?"));
60                 }
61                 // 取到文件
62                 File target = new File("source/src/main/webapp/assets/"+filePath);
63                 // 计算hash的元素
64                 String params = target.getName()+ target.length() + target.lastModified();
65                 String hashValue = DigestUtils.md5DigestAsHex(params.getBytes());
66                 // 比较新旧hash
67                 if (oldHash == null || !oldHash.equals(hashValue)){
68                     line = line.replace(path, filePath + "?"+hashValue);
69                     // 赋值新行
70                     lines.set(i, line);
71                     isUpdated = true;
72                 }
73             }
74         }
75         if (isUpdated){
76             // 更新文件
77             FileUtils.writeLines(f, lines);
78             System.out.println(f.getAbsolutePath());
79         }
80     }
81 }

3、总结

  使用这种方法有个弊端,每次发布时会造成很多文件被修改,对于这种修改,建议不上传,打包后可恢复原代码,

  仅供参考,如有错误请联系我

原文地址:https://www.cnblogs.com/niusj/p/11662592.html

时间: 2024-10-12 17:18:42

解决jsp文件的缓存问题的相关文章

myeclipse解决JSP文件中script背景颜色的调整

1导入MyEclipse的主题后,打开jsp或者html文件,jsvascript部分就蒙受上了一层白色,弄不掉了.症状如下: 解决办法如下 myeclipse解决JSP文件中script背景颜色的调整,布布扣,bubuko.com

解决JSP页面图片缓存问题

<% String imagepath="D:\\work\\dbUpdate\\src\\main\\webapp\\newyzm.png"; %> <img src="<%=imagepath+"?rand="+(new java.util.Random()).nextInt(10000)%>" />

导入项目到myeclipse中,项目上打了叉,jsp文件上都是叉

首先你要明白,你导入的项目很可能环境跟你当前的eclipse环境是不一样的,jdk版本,与jre版本是否一致,比如项目中使用的tomcat的名字是777,你的eclipse当中不能有777的tomcat,首先把环境需要更改的地方进行更改! 然后解决jsp文件都是叉的问题,对于jsp文件当中说servlet,jsp等等不认识,那么基本上就缺少两个jar包,而这两个jar包在tomcat的安装目录里有 jsp-api.jar servlet-api.jar 导入这两个jar包里有 此时所有jsp文件

MyEclipse打开JSP文件报&quot;Failed to create the part&#39;s controls&quot;解决方法汇总

我把HTML代码放到JSP中的,昨晚还能用,今天就打不开了,在网上找了半天解决方法,总算解决了. 图片分享: 方法1. 在"开始"-->"运行"---->"cmd"进入命令提示行后,再进入myeclipse安装目录的eclipse文件夹,然后输入myeclipse -clean即可 方法2. 找到myeclipse安装目录的configuration文件夹删除除config.ini以外的所有文件(记得备份),重启myeclipse.

解决JSP路径问题的方法(jsp文件开头path, basePath作用)

在JSP中的如果使用 "相对路径"  则有可能会出现问题. 因为 网页中的 "相对路径" , 他是相对于 "URL请求的地址" 去寻找资源. 上面这句话是什么意思呢 ? 举个例子: 假如我们有一个项目: MyApp 在该项目下, 有一个jsp文件夹 该文件夹下包括: login.jsp    // 登陆页面 register.jps  // 注册页面 我们在浏览器中输入地址 (注意: 地址的内容): http://localhost:8080/M

eclipse编辑jsp文件和javascript代码很卡解决办法

1.Window -> Preference -> General -> Editors -> Text Editors -> HyperLinking -> 在用Ctrl键控制的HyperLinking Style Nevigation列表下, 取消勾选与JPS或Javascript有关的选项 2.关闭eclipse 对于js的自动提示,避免eclipse响应缓慢和崩溃 Windows -->Preference -->JavaScript -->E

MyEclipse打开JSP文件报&quot;Failed to create the part&#39;s controls&quot;解决方法

HTML代码放到JSP中的,打不开了,在网上找了半天解决方法,总算解决了. 方法1. 在"开始"-->"运行"---->"cmd"进入命令提示行后,再进入myeclipse安装目录的eclipse文件夹,然后输入myeclipse -clean即可 方法2. 找到myeclipse安装目录的configuration文件夹删除除config.ini以外的所有文件(记得备份),重启myeclipse. 方法3. 找到myeclipse安

MyEclipse中的jsp文件中引入外部js文件时,乱码问题的解决

在myEclipse中右击js文件选择最下面的Properties选项,将Other修改为jsp文件的编码格式就可以了, 我的是UTF-8,只要修改完就没有问题了.

解决.jsp及静态资源文件访问404的问题

我们在做Web项目时,经常将.jsp文件放到webapp\WEB-INF下,这时,我们访问jsp等文件的时候,就会报404. 如果是纯前后端分离的项目,后端只返回数据,不处理页面,也没问题.但,有时我们希望接口部署到tomcat的时候,能有一些页面做提示,显示一些提示性消息. 在web.xml中配置<servlet-mapping>时,如果配置成"/*"则所有资源都拦截,包括jsp及资源文件. 此时,需要改为"/". 并且,将jsp及资源文件放到weba