清理緩存中的頭像

晚上和老同事談及QQ空間頭像修改後,頁面上其它地方的圖像也立馬修改過來了。看了一下,說了我的想法(因爲以前這樣做過):

假設請求地址爲 http://abc.com/a.gif

1、在flash設置完成頭像後,在地址後面帶個隨機數,例如:http://abc.com/a.gif?k=xxxxx  將頁面中所有能看到之前圖像的位置設置爲這個地址;

2、用ajax設置頭部不緩存後,請求http://abc.com/a.gif這個地址,這樣再次請求http://abc.com/a.gif這個地址時,瀏覽器的緩存已經是最新的了;

其實這是一種較爲理想的狀態,爲什麼呢?這種情況是,在設置完成頭像後,地址http://abc.com/a.gif再次請求的文件就是最新的了(也就是CDN在設置成功頭像後,URL地址被清理過了)。

但同事給我一個地址卻是我如此刷新都是舊的(據說會被CDN給緩存一天),但加了隨機數後立馬是最新的了。要解決這個問題,目前想到的辦法是本地存儲一個cookie了,裏面記錄一個版本號,所有主人的頭像都使用如下規則進行請求:http://abc.com/a.gif?v=1.x  (1.x是版本號,從cookie中獲取),這樣就能保存更新過後url始終是最新的,但同時比上面那種方法麻煩一點,每次都得用JavaScript拼一次地址了~ 還得更新和設置版本號,如果cookie被清空了,版本號還不知道從多少算起呢~~~~

所以最好的方式還是想辦法去讓後臺在更新完圖像後,馬上清理掉CDN中對圖像URL的緩存(地址可能不止一個,如果圖像有大、中、小三種規格)

講了半天,還是看看代碼,這段代碼主要就是請求最新資源的公用方法。(jQuery中實現些方法,你只能改源代碼了----我改過JQ的源碼)

1: <script type='text/javascript'>   2:     function send(opts){   3:         var xhr = getXHR();   4:            5:         xhr.open(opts._method, opts._url, opts._isAsync);   6:     7:         opts._method = (opts._method || "post").toUpperCase();   8:     9:         if (opts._method == 'POST' && !opts._isHeaderSetted) {  10:             xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  11:             xhr.setRequestHeader('Content-Type', 'image/jpeg');  12:             opts._isHeaderSetted = true;  13:         }  14:    15:         if(opts._noCache){  16:             xhr.setRequestHeader('If-Modified-Since', 'Thu, 1 Jan 1970 00:00:00 GMT');          17:             xhr.setRequestHeader('Cache-Control', 'no-cache');          18:         }  19:    20:         var d = getStr(opts._data);  21:    22:         xhr.onreadystatechange = function(){  23:             if (xhr.readyState == 4) {  24:                 if (xhr.status >= 200 && xhr.status < 300) {  25:                     opts._callback({});  26:                 }  27:                 else {  28:                     opts._callback('error');  29:                     return;  30:                 }  31:             }  32:         }  33:         xhr.send(opts._method == 'POST' ? d : null);  34:     }  35: </script>

最主要的兩段代碼:

1、設置請求頭部信息

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.setRequestHeader('Content-Type', 'image/jpeg');

2、設置請求頭部不緩存(返回結果正常爲200而非304)

xhr.setRequestHeader('If-Modified-Since', 'Thu, 1 Jan 1970 00:00:00 GMT');        xhr.setRequestHeader('Cache-Control', 'no-cache');   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章