一、瀏覽器中F5和CTRL F5的行為區別
我們直接來看效果,下面是我打開qq網頁,分別使用F5和CTRL F5,我們來看區別。
F5:
CTRL F5:
區別:
首先直觀上的區別是CTRL F5明顯比F5加載速度慢了。觀察資源加載發現,F5中大部分資源的狀態碼都是304,也就是重定向,使用了很多緩存資源;而CTRL F5中所有資源狀態碼都是200,都是重新下載了資源。
1.F5使用緩存,並且只有在資源內容發生變化的時候才會去更新資源
當刷新一個頁面的時候,瀏覽器會嘗試使用各種類型的緩存,並且會發送If-Modified-Since
頭到服務器,如果服務器返回304 Not Modified
,那么瀏覽器會使用本地的緩存;如果服務器返回200 OK
和資源內容,那么瀏覽器會使用返回的資源內容,並把資源內容進行緩存,待下次使用。
注:刷新頁面,會讓瀏覽器向服務端發起驗證,忽略 max-age
。
2.CTRL-F5 強制更新頁面資源的緩存
MSIE會發送Cache-Control: no-cache
頭,Firefox和Chrome除了發送Cache-Control: no-cache
頭之外,還會發送Pragma: no-cache
頭。Opera比較另類,不發送任何和緩存相關的頭。
二、如何強制更新資源
1.加上請求頭If-Modified-Since和Cache-Control
下面我們來看CTRL F5是如何做到強制更新資源而不適用緩存的。
我們看上面例子如何做到的
我們發現http請求頭中多了cache-control:no-control;如果服務器響應頭中規定了Last-Modified,我們還需要在http頭部加上If-Modified-Since:0。
在ajax中可以使用setRequestHeader()方法。
注:no-cache
並不是說「不緩存」,它意味着使用緩存前必須檢查(或者說驗證
)這個資源在服務端是否有更新。no-store
用來告知瀏覽器完全不要緩存這個資源。類似的,must-revalidate
並不是說「每次都要驗證」,它意味着某個資源在本地已緩存時長短於 max-age
指定時長時,可以直接使用,否則就要發起驗證。
2.meta方法
<META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <META HTTP-EQUIV="expires" CONTENT="0">
3.清理form表單的臨時緩存
<body onLoad="javascript:document.yourFormName.reset()">
其實form表單的緩存對於我們書寫還是有幫助的,一般情況不建議清理,但是有時候為了安全問題等,需要清理一下!
4.隨機數或者隨機時間
URL 參數后加上 "?ran=" + Math.random(); //當然這里參數 ran可以任意取了 在 URL 參數后加上 "?timestamp=" + new Date().getTime();
參考資料:http://weizhifeng.net/difference-between-f5-and-ctrl-f5.html
http://www.haorooms.com/post/js_llq_hc