而後者是設定了一套校驗規則,用來校驗當前客戶端所緩存的資源是否仍然是新鮮的。而這個校驗通常是發生在前者所設定的有效期失效之時(換言之就是Freshness在前,Validation在後)。當緩存失效時,客戶端會在請求頭中包含前置條件頭,再次向伺服器發送請求,當校驗未失效會返回304 Not Modified,否則就會按原有邏輯完整返回。涉及到的HTTP頭有:ETag、Last-Modified、If-Modified-Since、If-None-Match、If-Range、Cache-Control等。
回到第一個問題中來。圖中的請求頭中包含了Cache-Control、If-Modified-Since、If-None-Match三個,其中「Cache-Control: max-age=0」的目的只是為了讓瀏覽器與源伺服器之間的各級中間代理重新向上游校驗的(因為緩存的有效期變成0了)。我猜你是使用Chrome直接連接Tomcat的,所以是不存在中間代理情況的。剩下If-Modified-Since和If-None-Match。If-None-Match的優先順序高於If-Modified-Since,RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests中有具體的優先順序描述。
第二個問題,目前瀏覽器的實現是不會對POST請求的響應做緩存的(從語義上來說也不應該),並且規範中也規定了返回狀態碼不允許是304。不過這並不表示POST的響應不能被緩存,根據RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content中描述的,如果在POST請求對應的響應中包含Freshness相關信息的話,這次響應也是可以被緩存,具體可以參考上面的那個鏈接。
首先,你要先比較了解 HTTP 協議里各個方法的定義。例如:GET 和 POST 方法
GET 方法是從指定的資源請求數據
GET 請求可被緩存
GET 請求保留在瀏覽器歷史記錄中
GET 請求可被收藏為書籤
GET 請求不應在處理敏感數據時使用
GET 請求有長度限制
GET 請求只應當用於取回數據
POST 方法向指定資源提交要被處理的數據
POST 請求不會被緩存
POST 請求不會保留在瀏覽器歷史記錄中
POST 不能被收藏為書籤
POST 請求對數據長度沒有要求
了解了基本的概念之後,你的第二問答案也很明顯了。第一張圖是用的 POST 方法提交的,所以不會緩存,成功之後返迴響應碼是 200 。 那麼再回答你第一個問題:控制緩存的參數很多,而且是有優先順序的。 從你貼的兩張圖就能找到 Cache-Control,If-Modified-Since,,Expires,,Etag 等等參數