一般情況下,浏覽器都會緩存已經訪問過的頁面內容,關於如何禁止浏覽器緩存的介紹,在網上到處都有相關的文章,但是,關於浏覽器如何利用緩存,如何處理緩存的講解,卻鮮有人談及.我一直為這個問題所困惑,這個問題也是絕大多數有經驗的web開發人員所共同面臨的問題,我有些朋友已做過幾十個大大小小的WEB項目,當與他們交流這些問題時,他們雖然也在項目中遇到和解決過這些問題,但由於沒有足夠的時間和精力來仔細思考這些問題的原因和細節,他們對這些問題始終也是一知半解、含糊不清,而目前又很少關於這些問題的專門和詳細講解,我最近用了兩天的時間,把浏覽器緩存的問題透徹地研究了一翻,主要包括一下方面的細節. 1.如何禁止浏覽器緩存,這是最簡單的問題,本來羞於在此講解,但是為了完整性,不妨將其列為一個知識點. 2.浏覽器在訪問已緩存過的資源時,它在什麼情況下會向服務器發送請求?在什麼情況下根本就不向服務器發送請求.這與浏覽器的緩存設置有關!但是,由於幾乎所有人的浏覽器都是采用的默認設置,所以,重點應該放在分析浏覽器的默認緩存設置的研究上. 3.當通過其他網頁文檔中的超鏈接來訪問某一個已經緩存過的資源時,浏覽器是否要向服務器發出訪問請求?如果不發,則會出現一個問題:當銷售一件商品後再回到商品庫存的顯示頁面時,看到的還將是先前看到的內容,而不是更新的庫存數據。但是,在訪問一個普通的Html文件時,如果浏覽器每次都向服務器發送訪問請求,效率就會相對低下,這就失去了緩存的意義和價值.所以,結論應是浏覽器訪問動態頁面時不能使用緩存,而訪問靜態頁面時應該使用緩存,但是,僅僅根據被訪問頁面的資源名稱,浏覽器是無法知道商品庫存的顯示頁面是屬於動態內容,還是屬於靜態內容。浏覽器是根據什麼方式來判斷它緩存的資源是動態的,還是靜態的呢?在什麼請求下,它會對緩存的資源總是發出新的請求呢? 4.對於緩存的內容,即使浏覽器向服務器發送了請求,但服務器在接收到請求後,可能不會返回內容,而是讓浏覽器繼續使用緩存的內容,這在實際應用中有什麼好處呢?如何處理其具體細節呢? 5.服務器端也有緩存,當服務器接收到浏覽器的請求後,假設它返回響應內容,但返回的響應內容可能不是最新的內容,而很可能是一個舊的緩存版本,這又是怎麼回事呢? 所有這些問題,在筆者的《深入體驗Java web開發內幕》一書中都有深刻的分析和詳細的實驗步驟. 以下是該書的節選(不包括服務器端緩存技術的講解,服務器端緩存技術在其他章節有案例分析) 4.5.8 浏覽器緩存內幕與getLastModified方法 在HttpServlet類中定義了一個getLastModified方法,其完整語法定義如下: protected long getLastModified(HttpServletRequest req) 其中的返回值表示自1970年1月1日的0點0分0秒開始計算的一個毫秒數,HttpServlet類中定義的getLastModified方法總是返回一個負數,在HttpServlet子類中可以對這個方法進行覆蓋,以便返回一個代表當前輸出的響應內容的修改時間,HttpServlet類的service方法可以根據這個返回值在響應消息中自動生成Last-Modified頭字段。 一般情況下,浏覽器都會緩存已經訪問過的頁面內容,getLastModified方法的返回值可以影響浏覽器如何處理和利用緩存內容。在詳細了解getLastModified方法的應用之前,應該先對浏覽器的緩存機制有所了解。單擊IE浏覽器的“工具”“Internet選項”菜單,打開“Internet選項”對話框,接著再單擊“常規”選項卡中的“Internet臨時文件”欄中的“設置”按鈕,打開如圖4.16所示的“設置”對話框