晚上和老同事談及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');