近几个月来的工作是一个交易系统持续改进项目 迭代发布周期大约为 ~ 周 最近一次迭代是V 版 在礼拜三完成发布 不幸的是 第二天上午就被老大逮过去 原来老大从生产中揪出了一个bug 大致的问题如下
系统中有一个常用的自定义控件 目的是协助选择客户 而V 版的持续改进需求是给控件增加两个筛选选项 支持不同的默认值配置 很简单的一个需 求 代码修改也简单 其中一个修改是给一个js文件里边的一个函数增加了一个传入参数 用来传递配置值 经过RC R测试 一切都显得很正常 不过上 了生产才被发现bug了 加载出来的客户明显不正常 数目不对 也与预期的查询配置不相符
检查控件内部跳转链接 发现问题 传递的参数明显与预期不符 而这个链接则是由上面修改过的JS函数生成 因此判定问题是由于客户端缓存了原版JS 文件 新函数的调用由旧函数所替换引发的 经过清除缓存 重新加载页面后 这个自定义控件能够正常工作 很不幸的是 我们是不能通过打电话告诉每一位用 户 你需要清除缓存 然后才能正常使用这个功能
到此时 我才意识到需要一种方法来控件JS的缓存问题 否则 后续任何涉及JS文件内容的修改 都会因为缓存无法获取最新JS文件 而导致生产事故
原则上 我们是需要在有JS更新的时候 才会去重新加载JS文件 而不是每次都重新加载 因此第一种做法给JS应用地址后添加随机参数是不可取的 因为它意味着 几乎每次加载页面都会是重新加载JS 而不会合理的利用缓存JS 但是 我们还有第二种更合理的做法 如果关注过一些国外网站代码 会发现 他们通常是在js链接后添加一个版本号参数 而不是随机数 当js代码发生修改时 只需要将版本号加 就可以很巧妙的解决通知客户端更新js文件 不知道 谁是第一个想到这种方法的人 不过毫无疑问 他是值得我们钦佩的 真是一个不错的idea的!
lishixinzhi/Article/program/Java/JSP/201311/20638
禁用客户端缓存
HTM网页
<METAHTTP-EQUIV="pragma"
CONTENT="no-cache">
<METAHTTP-EQUIV="Cache-Control"
CONTENT="no-cache,must-revalidate">
<META
HTTP-EQUIV="expires"CONTENT="Wed,26Feb199708:21:57
GMT">
ASP网页
<%
Response.Expires=
-1
Response.ExpiresAbsolute=Now()-1
Response.cachecontrol="no-cache"
%>
PHP网页
header("Expires:Mon,26Jul199705:00:00GMT")
header("Cache-Control:no-cache,must-revalidate")
header("Pragma:no-cache")
JSP
response.setHeader("Pragma","No-Cache")
response.setHeader("Cache-Control","No-Cache")
response.setDateHeader("Expires",0)
C#中禁止cache的方法!
Response.Buffer=true
Response.ExpiresAbsolute=System.DateTime.Now.AddSeconds(-1)
Response.Expires=0
Response.CacheControl="no-cache"
加入
<MEATHTTP-EQUIV="Pragma"
CONTENT="no-cache">
不缓存。
一、Expires(期限)
说明:可以用于设定网页的到期时间。一旦网页过期,必须到服务器上重新调阅。
用法:<METAHTTP-EQUIV="expires"CONTENT="Wed,26Feb1997
08:21:57GMT">
注意:必须使用GMT的时间格式。
二、Pragma(cache模式)
说明:禁止浏览器从本地机的缓存中调阅页面内容。
用法:<META
HTTP-EQUIV="Pragma"CONTENT="no-cache">
注意:这样设定,访问者将无法脱机浏览。
三、脚本实现
<%
response.expires=0
response.expiresabsolute=now()
-1
response.addHeader"pragma","no-cache"
response.addHeader"cache-control","private"
Response.cachecontrol="no-cache"
%>
IE浏览器访问一个网页的时候,首先会到临时文件夹中去寻找和这个网页相关的各个文件(如各种图片)。如果在临时文件夹中找到了一些文件,那么浏览器就会使用这些临时文件夹中的文件,而不去服务器下载这些文件。
不幸的是,我的服务器上的文件是经常变化的,如果IE优先考虑临时文件夹中的文件,那么就不能反映出我服务器上的变化。
现在有两个解决办法,但都有缺陷:
一是使用网页的自刷新,但是刷新速度快的话会有闪烁,不符合我其他方面的要求。
二是在IE设置中设成“每次访问此页时检查”。此时IE不考虑临时文件夹中的内容,直接从服务下载各个文件。但是这种办法需要用户进行设置,对用户来说有点麻烦。而且这样的设置会影响用户访问其他网站的速度。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)