以下是本人對這些現象的個人理解,不正確的還請指正。
首先來看一下表面現象:
用來測試的瀏覽器為ie瀏覽器,首先將瀏覽器的快取全部清空。
第一次訪問目標位址,我們的開發者工具中網路面板顯示情況如下:
相應的請求頭和響應頭分別為:
1.request頭部,ie瀏覽器沒有控制快取的資訊
2.response的頭部資訊:
可以看到,響應表頭新增了etag和last-modified資訊。etag和last-modified的意義將在下文講到。
此時我們分別通過按f5重新整理按和在位址列裡重新輸入位址觀察現象。
按f5重新整理按鈕:
我們得到乙個304的狀態碼,意思是伺服器資源並沒有修改,b.html將從快取載入。對這次請求的request和response進行分析。
request請求:
可以看到,這次的請求頭部有乙個if-modified-since和if-none-match資訊。它們的含義大致為:在第一次訪問的過程中,我們看到響應裡有etag和last-modified兩個key的資訊。last-modified根據字面理解就是該資源上次修改的日期。etag可以簡單理解為資源的乙個識別符號,在資源的各個生命週期中,它都具有不同的
值。當資源發生變更時,如果其頭資訊中乙個或者多個發生變化,或者訊息實體發生變化,那
麼etag也隨之發生
變化。第二次請求的if-modified-since和if-none-match作用便是與伺服器上儲存的etag和last-modified進行對比,如若if-modified-since與last-modified相等並且etag和if-none-match相等,則伺服器返回304狀態碼,表示資源並沒有重新整理。若不相等,則重新從伺服器進行資源的獲取。
明白了以上的原理,我們分析上面的請求頭,可以看到該對比是相等的,所以系統的response便是304狀態碼,我們可以看一下這個response。
分析了按f5出現304狀態碼的原因,我們再來看一下在位址列輸入出現的結果
位址列輸入位址按回車:
可以看到,結果為200狀態碼,結果來自快取,意思就是瀏覽器並沒有傳送請求。
我們看到的請求的標頭也是空的,那麼位址列輸入位址按回車意思就是直接從快取進行載入,而不去進行快取內容的更新驗證。但是問題來了,我們都知道快取是有乙個過期時間的,如果快取沒有過期可以看到以上結果,如果快取過期怎麼辦呢,我們繼續分析。
現在我們用charles工具進行分析,該工具可以攔截http的請求響應並進行相應的想改再傳送。
我們首先在charles打好斷點,清楚快取,訪問該html頁面。
此時,我們的該html的響應中,給它新增乙個過期時間,cache-control:max-age=30。意思是該快取可以存活30s,具體的cache-control細節我正在研究,並在將來寫相應的原理講解的文章。
這時,將這個請求,返回給瀏覽器。等待30s,我們再次通過位址列輸入位址按回車鍵,可以看到此次請求並沒有像之前那樣直接從快取載入資料,而是向伺服器傳送了請求,進行了快取的驗證工作。
簡化瀏覽器位址列訪問路徑
普通情況下,你的專案project中的web.xml檔案裡進行了這種配置 index.jsp 那麼在瀏覽器位址列輸入http localhost 8080 你的project名 就是預設訪問的project的webroot資料夾下的index.jsp檔案 我想輸入http localhost 808...
瀏覽器位址列背後的logic
曾經有面試題是這樣的 描述在瀏覽器的位址列中輸入 後發生了什麼?1 服務端返回baidu頁面資源,瀏覽器載入html 2 瀏覽器開始解析 3 發現link,傳送請求載入css檔案 4 瀏覽器渲染頁面 5 發現,傳送請求載入,並重新渲染 6 傳送請求js檔案,阻塞渲染。如果js對dom進行了操作,則會...
瀏覽器位址列的組成部分
舉例 第一部分 http http即資料傳輸協議。協議是一種規範或標準,需要按照這個標準進行資料傳輸,如果不加,瀏覽器不會執行資料傳輸。第二部分 127.0.0.1 8848 主機 ip 網域名稱 埠號 127.0.0.1 ip 網域名稱 8848 埠號 區分同一臺電腦上多個服務 第三部分 web2...