一般情況下,瀏覽器都會緩存已經訪問過的頁面內容,關於如何禁止瀏覽器緩存的介紹,在網上到處都有相關的文章,但是,關於瀏覽器如何利用緩存,如何處理緩存的講解,卻鮮有人談及.我一直為這個問題所困惑,這個問題也是絕大多數有經驗的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所示的“設置”對話方塊。
|