web开发中常常遇到一些很奇怪的问题,例如,发现了问题,改了脚本,结果发布后,问题依然存在,但在服务器上一看,发布的脚本确实改了!!最后才发现,是浏览器缓存在做怪!!javascript
如今讨论几种清除浏览器缓存的方法。html
一种原理是HTTP Header 参数Cache-Control来清空缓存,另外一种是利用URL上添加查询字符串来欺骗浏览器强制从服务端读取数据,避免缓存。java
1利用HTTP协议清空jquery
Cache-Control
的参数包括:web
max-age=
[单位:秒 seconds] — 设置缓存最大的有效时间. 相似于 Expires
, 可是这个参数定义的是时间大小(好比:60)而不是肯定的时间点.单位是[秒 seconds].s-maxage=
[单位:秒 seconds] — 相似于 max-age
, 可是它只用于公享缓存 (e.g., proxy) .public
— 响应会被缓存,而且在多用户间共享。正常状况, 若是要求 HTTP 认证,响应会自动设置为 private.private
— 响应只可以做为私有的缓存(e.g., 在一个浏览器中),不能再用户间共享。no-cache
— 响应不会被缓存,而是实时向服务器端请求资源。这一点颇有用,这对保证HTTP 认证可以严格地禁止缓存以保证安全性颇有用(这是指页面与public结合使用的状况下).既没有牺牲缓存的效率,又能保证安全。no-store
— 在任何条件下,响应都不会被缓存,而且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。must-revalidate
— 响应在特定条件下会被重用,以知足接下来的请求,可是它必须到服务器端去验证它是否是仍然是最新的。proxy-revalidate
— 相似于 must-revalidate
,但不适用于代理缓存. 具体使用: 在网页head中添加浏览器
1
2
3
|
<meta http-equiv=
"pragma"
content=
"no-cache"
>
<meta http-equiv=
"content-type"
content=
"no-cache, must-revalidate"
>
<meta http-equiv=
"expires"
content=
"Wed, 26 Feb 1997 08:21:57 GMT"
>
|
1
2
3
4
5
|
Response.Buffer = True ;
Response.ExpiresAbsolute = Now() -
1
;
Response.Expires =
0
;
Response.CacheControl =
"no-cache"
;
Response.AddHeader
"Pragma"
,
"No-Cache"
;
|
通常有两种方式,添加随机数,添加时间错缓存
例如添加随机数安全
1
|
document.write(
"<script src='test.js?rnd="
+Math.random()+
"'>"
)
|
1
|
url:
"../SurveyGetRecordData.aspx?date="
+(
new
Date().getMilliseconds())
|
能够看到这两种方式,都是每次强制客户端从服务端读取数据,根本不使用缓存,但若是是js样式之类不多变更的呢?使用缓存,若是修改了脚本,客户端老是使用没有改过的脚本,等于没有修改!!不使用缓存,脚本又不多改动,每次都从服务端读取,没有必要!!如何解决??
实际上是很简单,仍是使用查询字符串,添加了一个相似版本号的查询字符串,若是修改了,就把这参数改变,不然就不改,这样,就能够在须要时缓存,不须要时不缓存了。服务器
例如:dom
1
|
<script type=
"text/javascript"
src=
"../jquery-easyui/jquery-1.8.0.min.js?ver=1711"
></script>
|