龙空技术网

原创|前端缓存引发的生产问题和解决方案

程序员老莫 133

前言:

眼前咱们对“浏览器清除js缓存”大致比较着重,看官们都想要剖析一些“浏览器清除js缓存”的相关知识。那么小编在网络上收集了一些有关“浏览器清除js缓存””的相关知识,希望各位老铁们能喜欢,朋友们快快来学习一下吧!

某一天,客服反馈,说用户购买某一产品时,提交订单失败,并发来用户的接口提示。我一看,这不是昨天晚上升级之前的页面吗?昨天验证过没有问题呢。为什么用户看到的是老的页面?应该是缓存的原因。回客服,让客户多刷新下页面,重新购买就可以了。

问题倒是解决了,但是客户体验非常不好,不能让老客户进来都重多次刷新页面吧!有没有方法可以解jsp、html或者js的缓存问题呢?

前言

解决前端缓存问题,就需要页面加载的时候,不去读取浏览器的缓存,而是从Web服务器上重新获取页面。

方法的讲解Jsp、html缓存的解决Js、css缓存的解决

一、方法讲解

服务端方法

response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", -10);

Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。

Cache -Control指定请求和响应遵循的缓存机制,no-cache指示请求或响应消息不能缓存。

Expires 响应头包含日期/时间, 即在此时候之后,响应过期,无效的日期,比如 -10, 代表着过去的日期,即该资源已经过期。

客户端方法

meta 是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中,meta 标签的用处很多。meta 的属性有两种:name和http-equiv。name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目 前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和 keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个:

name 属性

1、<meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等;

2、<meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词;

3、<meta name="DEscription" contect="">告诉搜索引擎你的站点的主要内容;

4、<meta name="Author" contect="你的姓名">告诉搜索引擎你的站点的制作的作者;

5、<meta name="Robots" contect="all|none|index|noindex|follow|nofollow">

http-equiv属性

1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80"> 和 <meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;又如英文是ISO-8859-1字符集,还有BIG5、utf-8、 shift-Jis、Euc、Koi8-2等字符集;

2、<meta http-equiv="Refresh" contect="n;url=">定时让网页在指定的时间n内,跳转到页面http;//yourlink;

3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式;

4、<meta http-equiv="Pragma" contect="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;

5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式;

6、<meta http-equiv="Pics-label" contect="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的;

7、<meta http-equiv="windows-Target" contect="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用;

8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion= 50)">和<meta http-equiv="Page-Exit" contect="revealTrans(duration=20,transtion =6)">设定进入和离开页面时的特殊效果,这个功能即FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。

二、Jsp、html缓存的解决

前端页面处理方法

禁止客户端缓存要在<head>中加入类似如下内容:

<meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> 

不设置超时时间

<%response.setHeader("Cache-Control","no-store");response.setHeader("Pragrma","no-cache");response.setDateHeader("Expires",0);%>

设置超时时间10分钟

<%int minutes = 10; Date d = new Date(); String modDate = d.toGMTString(); String expDate = null; expDate = (new Date(d.getTime() + minutes * 60000)).toGMTString(); response.setHeader("Last-Modified", modDate); response.setHeader("Expires", expDate); response.setHeader("Cache-Control", "public"); // HTTP/1.1 response.setHeader("Pragma", "Pragma"); // HTTP/1.0 %>

后端处理方法

public class CacheJiejue extends HttpServlet {  public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  response.setContentType("text/html;charset=utf-8");  //指定该页面不缓存  response.setDateHeader("Expires",-1); //IE游览器支持的  //保证兼容性  response.setHeader("Cache-Control", "no-cache");  response.setHeader("Pragme", "no-cache");  }   public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  this.doGet(request, response);  }  }

三、Js、css缓存的解决

Js或者css会被浏览器缓存下来,只有浏览器重启后才会删除,甚至重启都不会删除。这样用户可能看到的就是缓存的页面效果。会照成生产问题。怎么解决呢?

方法一

在js或者css地址后面添加时间戳或者随机数,这样每次请求都是新的地址,可以骗过浏览器的缓存,每次去服务器获取最新的代码。但是每次都去请求服务器获取新的代码,会占用带宽。

 <link rel="stylesheet" href="/Resource/css/webapp_reset.css?s=<%=System.currentTimeMillis()%>"/> <script type="text/javascript" src="/Resource/js/mobiscroll.custom-2.16.1.min.js?s=<%=Math.random()%>" ></script>

方法二

可以添加版本号,每次修改的话在地址后面生成新的版本号,可以用系统时间作为当前更新的版本号。

<script type="text/javascript" src="/Resource/js/mobiscroll.custom-2.16.1.min.js?version=20190908" ></script>

搞定!!喜欢的朋友可以关注下~

标签: #浏览器清除js缓存 #浏览器清除js缓存的方法 #webapp缓存 #前端处理缓存问题 #前端处理缓存问题的方法