解决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值--gt;");
17         system.out.println("被更新的文件如下: ");
18         file file = new file("source/src/main/webapp/web-inf/views/modules");
19         updatefilehash(file);
20         system.out.println("lt;--结束更新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         listlt;stringgt; lines = fileutils.readlines(f);
42         boolean isupdated = false;
43         for (int i=0;ilt;lines.size();i++) {
44             string line = lines.get(i);
45             // 只更新head部分
46             if (line.contains("lt;/headgt;")){
47                 break;
48             }
49             if (line.contains("${assets}")amp;amp;(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、总结

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

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

解决jsp文件的缓存问题

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

IT人知识库 原文地址:http://www.itpeo.net/9999/4550446.html





写一个方法,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

思路: 1.两个数异或:相当于每一位相加,而不考虑进位;2.两个数相与,并左移一位:相当于求得进位;3.将上述两步的结果 ...

CodeforcesRound564题解

很抱歉让标题把您骗进来了。 这是一场打得最失败的p1。 作为一个橙名一题都不会 旁边紫名的pb怒切3题,p2的也随便玩玩 ...

常见的Web源码泄露总结

常见的web源码泄露总结 源码泄露方式分类 .hg源码泄露 漏洞成因: hg init 的时候会生成 漏洞利用: ...

PILpiperror

结果显示: 提示mdash;mdash;could not find a version that satisfies ...

P4197Peaks

\(\color{#0066ff}{题目描述}\) 在bytemountains有n座山峰,每座山峰有他的高度\(h_i ...

springboot自定义异常和全局异常处理

模拟开发过程中的异常处理: 场景:   如果不对异常处理,返回给前端的将是一个异常错误页日志   所以要异常处理 首先准 ...

UVa11168(凸包、直线一般式)

要点 找凸包上的线很显然 但每条线所有点都求一遍显然不可行,优化方法是:所有点都在一侧所以可以使用直线一般式的距离公式 ...

生物信息学常用软件

python类 rodeo 绘图 markdownpad2 open live write ...

arp之协议学习路线

①arp(address resolution protocol)即地址解析协议, 用于实现从 ip 地址到 mac 地 ...

python之is和==的区别//编码和解码

一.is 和 == 的区别: == 比较 #比较两边的值 is 比较 #比较的是内存地址 id()是python的 ...

Redis做消息队列

1.连接从redis中获取日志文件并存储到es中 [[email#160;protected] ~]# vim /us ...

Git创建多人仓库与配置

先于仓库网站手动创建新仓库,然后复制ssh,准备进入下一步 在本地新建一个文件夹(路径为全英文),该文件夹为本地仓库存储 ...

宝塔面板设置伪静态规则

宝塔面板后台集成了站点伪静态规则设置选项,无需更改linux服务器conf文件配置即可自定义站点伪静态规则,真的很方便, ...

有关内存溢出和内存泄漏的知识点

在jvm中,有关内存可能会出现的两种错误内存溢出和内存泄漏,怎么理解这两种错误: 1、内存泄漏memory leak : ...

javajavabean和List存储表格数据(用List存储类)

javabean一个具有完整的set和get方法,还有一个空构造器的类 class user{ private ...

自定义SWT控件一之自定义单选下拉框

一、自定义下拉控件 自定义的下拉框,是自定义样式的,其中的下拉框使用的是独立的window,非复选框的下拉框双击单机其 ...

windows(hexo)使用git时出现:warning:LFwillbereplacedbyCRLF

hexo出现warning: lf will be replaced by crlf git config --glo ...

ES遇到的一个坑too_many_clauses:maxClauseCount

异常: caused by: org.elasticsearch.common.io.stream.notserial ...

c++的动态绑定和静态绑定

为了支持c++的多态性,才用了动态绑定和静态绑定。 1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。 2、 ...

SSL2058_字符串编辑_字符串

题目描述 为了对一些资料进行保密,奶牛们要对某些文章进行编辑。编辑的方法很奇特:要把原有文章的某些词句按照某些规则用另一 ...