關(guān)于Ajax學(xué)習(xí)中的緩存問題


向服務(wù)器發(fā)送請求

如需將請求發(fā)送到服務(wù)器,我們使用 XMLHttpRequest 對象的 open() 和 send() 方法:

xmlhttp.open("GET","ajax_info.txt",true);

xmlhttp.send();

在上面的例子中,可能得到的是緩存的結(jié)果。

為了避免這種情況,請向 URL 添加一個唯一的 ID:

xmlhttp.open("GET","/try/ajax/demo_get.php?t="+Math.random(),true);

xmlhttp.send();



對于以上代碼(代碼來源鏈接?)

給這個url加上一個,Math.random(),url這個參數(shù)不就成了:demo_get.asp?t=0.1234567890123456

*! 這為何能正常運行呢?

答(回答來自segmentfault?):

例如你的文件URL是:flie/xxx.txt

第一次Ajax請求這個文件,瀏覽器可能會將這個文件緩存在本地,下次再打開這個文件瀏覽器就可以直接打開本地文件,無需重新通過網(wǎng)絡(luò)再次獲取。

但是,瀏覽器有可能會好心辦了壞事,因為你修改了服務(wù)器的flie/xxx.txt文件,但是瀏覽器不知道,它還是會打開本地緩存的文件,這就會造成一些BUG。

為了防止出現(xiàn)這種問題,在URL上加一個參數(shù)“t=隨機數(shù)”,瀏覽數(shù)會認為兩次打開的是不同的東西,第二次Ajax就不會使用第一次Ajax的緩存。

至于“這為何能正常運行呢”?

在URL上加上參數(shù),同樣還是打開這個文件,當(dāng)然可以正常運行。

flie/xxx.txt?t=0.1234567890123456,這個URL同樣還是打開文件flie/xxx.txt。

而url問號后面的部分叫query string(查詢字符串)。如果url對應(yīng)的是php等實現(xiàn)的動態(tài)頁面,那么查詢字符串可能會被服務(wù)器處理。如果是個靜態(tài)文件,查詢字符串對服務(wù)器而言通常沒啥作用,被服務(wù)器忽略,而對瀏覽器來說卻可以防止緩存。

問號后面就是給請求加的一些數(shù)據(jù)啦。如果服務(wù)器沒有處理這部分,就當(dāng)不存在了。但是產(chǎn)生的URL中含有隨機數(shù),所以就是唯一的了。也就沒有緩存。


但是,

目前網(wǎng)上加隨機數(shù)來強行刷新緩存的做法是錯的!!

HTTP協(xié)議中早已有緩存控制方法,詳情自己搜HTTP協(xié)議之緩存控制?部分!(鏈接來自博客園)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容