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>
|