書名: 深入分析Java Web技術內幕作者名: 許令波本章字數: 1897字更新時間: 2018-12-30 19:21:13
1.3 HTTP協議解析
B/S網絡架構的核心是HTTP協議,掌握HTTP協議對一個從事互聯網工作的程序員來說非常重要,也許你已經非常熟悉HTTP協議,這里除了簡單介紹HTTP協議的基本知識外,還將側重介紹實際使用中的一些心得,后面將以實際使用的場景為例進行介紹。
要理解HTTP協議,最重要的就是要熟悉HTTP協議中的HTTP Header,HTTP Header控制著互聯網上成千上萬的用戶的數據的傳輸。最關鍵的是,它控制著用戶瀏覽器的渲染行為和服務器的執行邏輯。例如,當服務器沒有用戶請求的數據時就會返回一個404狀態碼,告訴瀏覽器沒有要請求的數據,通常瀏覽器就會展示一個非常不愿意看到的該頁面不存在的錯誤信息。
常見的HTTP請求頭和響應頭分別如表1-1和表1-2所示,常見的HTTP狀態碼如表1-3所示。
表1-1 常見的HTTP請求頭

表1-2 常見的HTTP響應頭

表1-3 常見的HTTP狀態碼

要看一個HTTP請求的請求頭和響應頭,可以通過很多瀏覽器插件來看,在Firefox中有Firebug和HttpFox,Chrome自帶的開發工具也可以看到每個請求的請求頭信息(可用F12快捷鍵打開),IE自帶的調試工具也有類似的功能。
1.3.1 查看HTTP信息的工具
有時候我們需要知道一個HTTP請求到底返回什么數據,或者沒有返回數據時想知道是什么原因造成的,這時我們就需要借助一些工具來查詢這次請求的詳細信息。
在Windows下現在主流的瀏覽器都有很多工具來查看當前請求的詳細HTTP協議信息,如在Firefox瀏覽器下,使用最多的是Firebug,如圖1-5所示。

圖1-5 Firefox瀏覽器下HTTP協議的信息
還有一個HttpFox工具提供的信息更全,如圖1-6所示,所有HTTP相關信息都可以一目了然。

圖1-6 HttpFox工具顯示的HTTP協議的信息
Chrome瀏覽器下也有一些類似的工具,如Google自帶的調試工具,同樣可以查看到這次請求的相關信息,如圖1-7所示。

圖1-7 Google自帶的調試工具顯示的HTTP協議的信息
Chrome下也有類似的Firebug工具,但是還不夠完善。
IE從7.0版本開始也提供了類似的HTTP調試工具,如自帶的開發人員工具可以通過F12鍵打開,HttpFox插件也有IE版本,讀者可以試著安裝一下。
1.3.2 瀏覽器緩存機制
瀏覽器緩存是一個比較復雜但是又比較重要的機制,在我們瀏覽一個頁面時發現有異常的情況下,通??紤]的就是是不是瀏覽器做了緩存,所以一般的做法就是按Ctrl+F5組合鍵重新請求一次這個頁面,重新請求的頁面肯定是最新的頁面。為什么重新請求就一定能夠請求到沒有緩存的頁面呢?首先是在瀏覽器端,如果是按Ctrl+F5組合鍵刷新頁面,那么瀏覽器會直接向目標URL發送請求,而不會使用瀏覽器緩存的數據;其次即使請求發送到服務端,也有可能訪問到的是緩存的數據,比如,在我們的應用服務器的前端部署一個緩存服務器,如Varnish代理,那么Varnish也可能直接使用緩存數據。所以為了保證用戶能夠看到最新的數據,必須通過HTTP協議來控制。
當我們使用Ctrl+F5組合鍵刷新一個頁面時,在HTTP的請求頭中會增加一些請求頭,它告訴服務端我們要獲取最新的數據而不是緩存。
如圖1-8所示,這次請求沒有發送到服務端,使用的是瀏覽器緩存數據,按Ctrl+F5組合鍵刷新后,如圖1-9所示。

圖1-8 HTTP的請求頭返回緩沖數據

圖1-9 按Ctrl+F5組合鍵刷新頁面時HTTP的請求頭返回數據
這次請求時從服務端返回的數據,最重要的是在請求頭中增加了兩個請求項Pragma:no-cache和Cache-Control:no-cache。為什么增加了這兩項配置項,它們有什么作用?
1.Cache-Control/Pragma
這個HTTP Head字段用于指定所有緩存機制在整個請求/響應鏈中必須服從的指令,如果知道該頁面是否為緩存,不僅可以控制瀏覽器,還可以控制和HTTP協議相關的緩存或代理服務器。HTTP Head字段有一些可選值,這些值及其說明如表1-4所示。
表1-4 HTTP Head字段的可選值

Cache-Control請求字段被各個瀏覽器支持得較好,而且它的優先級也比較高,它和其他一些請求字段(如Expires)同時出現時,Cache-Control會覆蓋其他字段。
Pragma字段的作用和Cache-Control有點類似,它也是在HTTP頭中包含一個特殊的指令,使相關的服務器來遵守,最常用的就是Pragma:no-cache,它和Cache-Control:no-cache的作用是一樣的。
2.Expires
Expires通常的使用格式是Expires:Sat, 25 Feb 2012 12:22:17 GMT,后面跟著一個日期和時間,超過這個時間值后,緩存的內容將失效,也就是瀏覽器在發出請求之前檢查這個頁面的這個字段,看該頁面是否已經過期了,過期了就重新向服務器發起請求。
3.Last-Modified/Etag
Last-Modified字段一般用于表示一個服務器上的資源的最后修改時間,資源可以是靜態(靜態內容自動加上Last-Modified字段)或者動態的內容(如Servlet提供了一個getLastModified方法用于檢查某個動態內容是否已經更新),通過這個最后修改時間可以判斷當前請求的資源是否是最新的。
一般服務端在響應頭中返回一個Last-Modified字段,告訴瀏覽器這個頁面的最后修改時間,如Last-Modified:Sat, 25 Feb 2012 12:55:04 GMT,瀏覽器再次請求時在請求頭中增加一個If-Modified-Since:Sat, 25 Feb 2012 12:55:04 GMT字段,詢問當前緩存的頁面是封面
與Last-Modified字段有類似功能的還有一個Etag字段,這個字段的作用是讓服務端給每個頁面分配一個唯一的編號,然后通過這個編號來區分當前這個頁面是否是最新的。這種方式比使用Last-Modified更加靈活,但是在后端的Web服務器有多臺時比較難處理,因為每個Web服務器都要記住網站的所有資源,否則瀏覽器返回這個編號就沒有意義了。
- Implementing Modern DevOps
- Building a Home Security System with Raspberry Pi
- 劍指JVM:虛擬機實踐與性能調優
- 青少年美育趣味課堂:XMind思維導圖制作
- Learning Informatica PowerCenter 10.x(Second Edition)
- Access 2016數據庫管
- 機器學習與R語言實戰
- OpenCV 4計算機視覺項目實戰(原書第2版)
- 基于ARM Cortex-M4F內核的MSP432 MCU開發實踐
- C專家編程
- Apache Camel Developer's Cookbook
- 運維前線:一線運維專家的運維方法、技巧與實踐
- 編程可以很簡單
- 奔跑吧 Linux內核
- Visual C++開發寶典