1.了解HTTP
1.1 HTTP簡介
就像兩個國家的元首會晤過程得遵守一定外交禮節一樣,瀏覽器與web服務器之間的一問一答的交互過程也得遵守一定的規則,這個規則就是HTTP協議。HTTP協議是 HyperText Transfer Protocol(超文本傳輸協議)的英文簡寫,它是TCP/IP協議集中的一個應用層協議,用戶定義瀏覽器與web服務器之間交換數據的過程以及數據本身的格式.HTTP協議在不斷的完善和擴展,因此有不同的版本,現在被廣泛使用的是 HTTP1.1,相對於HTTP1.0而言,HTTP1.1最大的特點是支持持續連接.
1.2 HTTP1.0與HTTP2.0的比較
HTTP1.0不支持持續連接,每次請求和響應都需要建立一個單獨的連接,每次連接只傳輸一個文檔和圖像,上一次和下一次請求完全分離.
為了克服HTTP1.0的缺陷,HTTP1.1支持持久連接,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲.
2. HTTP消息的格式
當你在瀏覽器地址欄鍵入域名地址然后敲回車時,這時瀏覽器將會生成請求消息發送給web服務器,服務器收到請求后,將生成響應消息回送給客戶端瀏覽器.瀏覽器發出的請求消息和web服務器回送的響應消息都叫HTTP消息,HTTP消息有一定嚴格規定的格式. 瀏覽器提交給web服務器的form表單內容和從web服務器上獲取的網頁內容僅僅是HTTP消息的一部分數據,瀏覽器與web服務器傳遞的信息還包含一般用戶所看不到的一些其他"隱藏"的信息.
一個完整的請求消息包括:一個請求行,若干消息頭,以及請求體.下面是HTTP請求消息的內容:
上面請求消息的第一行為請求行,請求行后面的部分都屬於請求頭部分.雖然該請求消息中沒有請求體,但進階着消息頭部分之后是一個空行(只有回車和換行符的行)必不可少,這個空行用於表示消息頭部分已經結束. 當用戶在地址欄直接訪問一個URL地址或單擊網頁上一個超鏈接時,瀏覽器將使用GET方式發送類似上面不包含實體內容的請求消息;只有使用POST,PUT和DELETE方式的請求消息才可以包含請求體.比如提交form表單時
一個完整的響應消息包括:一個狀態行,若干消息頭,以及響應體.下面是HTTP響應消息的內容:
上面的響應消息中第一行為狀態行,緊跟狀態行后面的部分是消息頭部分,接着是一個空行,然后是響應體(這里只顯示了頭兩行).在通常情況下響應消息都包含響應體,響應體就是網頁的內容.
2.1 HTTP消息頭
HTTP請求和HTTP響應都使用消息頭來描述 HTTP消息本身的信息,這種描述信息的信息稱為元信息. 使用消息頭,可以實現HTTP客戶端與服務器之間的條件請求和應答. 消息頭相當於與服務器和瀏覽器之間的一些暗號指令,服務器可以使用消息頭來通知瀏覽器采取一些特殊動作.例如:隔多久刷新網頁,用哪種字符編碼解釋網頁內容等等;瀏覽器也可以使用消息頭告訴服務器一些信息,例如:當前請求是通過哪個網頁上的超鏈接引導進來的,瀏覽器的國家語言版本等等.
消息頭部分是由一系列的行組成,每行都包含一個頭字段名稱,然后依次是冒號,空格,值,回車換行. 消息頭字段是不區分大消息的,但習慣上將每個單詞的首字母大寫,整個消息頭部分中的格個消息頭可按任何順序排列.
按照其作用分類,消息頭又可分為通用信息頭,請求頭,響應頭,實體頭四類.
- 通用信息頭: 既能用於請求消息中,也能用戶響應消息中,但與被傳輸的實體內容沒有關系的常用消息頭.
- 請求頭:用於在請求消息中向服務器傳遞附加信息.
- 響應頭:用於響應信息中向客戶端傳遞附加信息.
- 實體頭:用作實體內容的元信息,描述了實體內容的屬性,包括實體信息的類型,長度,壓縮方法等
請求消息頭可以包括通用信息頭,請求頭和實體頭; 響應消息中可以包括通用信息頭,響應頭和實體頭; 某些頭字段既能用於請求頭也可以用於響應頭.
2.2 請求行與狀態行
2.2.1 請求行
請求消息的請求行包括三個部分:請求方式,資源路徑,以及所使用的HTTP協議版本,各個部分用空格分隔,語法格式為:
請求方式 資源路徑 HTTP版本號
2.2.2 狀態行
響應消息的狀態行中包括三個部分:HTTP協議的版本號,一個表示成功或錯誤的整數代碼(狀態碼)和對狀態碼進行描述的文本信息,各部分用空格分隔,語法格式為:
HTTP版本號 狀態碼 原因描述
2.3 使用Get和POST方式傳遞參數:
2.3.1 GET方式
當用戶在瀏覽器地址欄中直接訪問某個URL地址或單擊網頁上一個超鏈接時,瀏覽器將使用GET方式發送請求.如果網頁form表單的method屬性設置為"GET"或者沒有設置method屬性的,瀏覽器默認使用GET方式提交數據.
在URL地址后面可以附加一些參數,每個參數由參數名和參數值組成,參數名和參數值之間用 等號(=)分隔,各個參數之間用&符分隔,URL地址與整個參數部分之間用問好(?)分隔,如下所示:
http://localhost:8080/Demo1/servletA?id=1&name=123&pwd=123
注意:當使用GET方式提交表單時,瀏覽器各個表單字段元素以及數據按照URL參數的格式附加在請求行的資源路徑后面.使用GET方式傳輸數據量是有限制的,一般限制在1kb下.
2.3.2 POST方式
如果網頁上的form元素的method屬性設置為"POST",當用戶提交表單請求時,瀏覽器將使用POST方式提交表單內容,並把各表單字段元素以及數據作為HTTP消息的請求體,發送給web客戶端,而不是作為URL地址的參數傳遞.因此POST方式傳輸的數據量要比GET方式大的多.
2.4 響應狀態碼
響應狀態碼用於表示服務器對請求的各種不同處理結果和狀態,它是一個三位的十進制數.響應狀態碼可歸為5中類別,使用最高為1到5來進行分類,如下所示:
- 100~199
- 表示成功接受請求,要求客戶端繼續提交下一次請求才能完成整個處理過程.
- 200~299
- 表示成功接受請求並已完成整個處理過程.
- 300~399
- 為完成請求,客戶端需一步進行細化請求.例如:請求資源已移動到一個新位置
- 400~499
- 客戶端請求有錯誤.
- 500~599
- 服務端出現錯誤
2.5 HTTP消息頭詳解
2.5.1 通用信息頭
通用信息頭既能用於請求消息,也能用於響應消息,它包括一些與被傳輸的實體內容沒有關系的常用信息頭段.
2.5.1.1 Cache-Control
如果Cache-Control頭字段用在客戶機發出的請求消息中,它用於通知位於客戶機和服務器之間的代理服務器如何使用已緩存的頁面.這種情況下此頭的取值為:no-cache,no-store,max-age,max-fresh,min-fresh,no-transform,only-if-cached等.
如果Cache-Control頭字段用在響應消息中,它用於通知客戶機和代理服務器如何緩存該頁面,在這種情況此頭取值為:public,private,no-cache,no-store,no-transform,must-revalidate,proxy-revalidate,max-age,s-maxage等.
在一個Cache-Control頭字段中可以設置多個值,例如:
Cache-Control:no-store,no-cache,must-revalidate
2.5.1.2 Connection
Connection頭字段用於指定處理完本次請求/響應后,客戶端與服務器是否還要繼續保持連接.
當Connection請求頭的值為Keep-Alive時,客戶端通知服務器返回本次請求結果后繼續保持連接;當Connection請求頭的值為close時,客戶端與服務器返回本次結果 后關閉連接. HTTP1.1默認采用持久連接,在客戶端發出請求消息中沒有指定Connection頭字段時,等效於Connection請求頭的值為Keep-Alive的情況.
2.5.1.3 Date
Date頭字段用於表示HTTP消息產生的當前時間.服務器回送正常響應消息中,應該總是設置Date頭字段.如果客戶端發送的請求消息包含請求體是也應該設置此頭字段.
2.5.1.4 Pragma
Pragma頭字段的設置值只能固定為:no-cache,即 Pragma:no-cache.
當Pragma頭字段用於響應消息時, 指示HTTP1.0客戶機不要緩存文檔.
當Pragma頭字段用於請求消息時,指示代理 服務器必須返回一個最新的文檔,而不能使用緩存的文檔.
2.5.1.5 Trailer
一些頭字段可以放置在HTTP消息的尾部,也就是可以在實體部分內容部分之后出現.對於放置在尾部的頭字段,需要在消息頭中使用此頭字段說明,例如:
Trailer: Date
2.5.1.6 Transfer-Encoding
如果HTTP消息的請求體部分采用某種傳輸編碼方式,使用此頭字段指定該編碼方式,目前設置值只有:chunked,用於把整個消息體分成一連串分段后進行傳輸.
2.5.1.7 Upgrade
此頭字段允許客戶機指定它所支持並希望將當前協議切換到通信協議.
2.5.1.8 Via
此頭字段用於指定HTTP消息所途徑的中介代理服務器名稱和所使用的協議,這個頭字段由代理服務器產生,每個代理服務器把他的信息追加到Via字段的最后,以映射HTTP消息途徑的多個代理服務器的順序.
2.5.1.9 Warning
Warning頭字段主要用於說明其他頭字段和狀態碼不能說明的一些附加警告信息,例如:返回的實體信息可能已過期.
2.5.2 請求頭
請求頭字段用於客戶端在請求消息中向服務器傳遞附加信息,主要包括客戶端可以接受的數據類型,壓縮方法,語言以及發出請求的超鏈接所屬頁面的URL地址信息等.
2.5.2.1 Accept
此頭字段用於支出客戶端程序(通常是瀏覽器)能夠處理的MIME(Multipurpose Intent Mail Extension,多用途Intent 郵件擴展)類型.例如:
Accept:text/html; image/*
2.5.2.2 Accept-Encoding
此頭字段用於指定客戶機能夠進行解碼的數據編碼方式,這里的編碼方式通常是指某種壓縮方式.例如:
Accept-Enoding:gzip,compress
2.5.2.3 Accept-Language
此頭字段用於指定客戶機期望服務器 返回哪個國家語言的文檔,可以指定多個逗號分隔的國家語言.例如:
Accept-Language:en-gb,zh-cn
2.5.2.4 Authorization
當客戶端訪問受口令保護的網頁文件時,web服務器會發送401響應狀態碼和WWW-Authorization響應頭,要求客戶機使用Authorization請求頭來應答.
2.5.2.5 Expect
此頭字段用於指定客戶機請求服務器采取的特殊行動,目前設置值只有100-continue,用於詢問服務器是否可以在后面 的請求中發送一個附加文檔.
2.5.2.6 From
此頭字段用於指定發送者的Email地址,它只被一些特殊的web客戶端程序使用,瀏覽器不會使用到它.
2.5.2.7 Host
此頭字段用戶指定資源所在的主機和端口號,格式與資源的完整URL中的主機名和端口號一樣,例如:
Host:www.baidu.com
2.5.2.8 If-Match
2.5.2.9 If-Modified-Since
2.5.2.10 If-None-Match
If-None-Match頭字段的作用與If-Match頭字段的作用正好相反,詳細請看If-Match介紹
2.5.2.11 If-Range
If-Range頭字段只能伴隨着Range頭字段一起使用,其設置值可以是實體標簽或HTTP的GMT格式的時間,如果設置值為實體標簽,且該標簽內容與服務器端的代表當前頁面內容特征的實體標簽相同,則服務器按Range頭的要求返回網頁部分內容,否則,服務器返回當前網頁的所有內容.
2.5.2.12 If-Unmodified-Since
2.5.2.13 Max-Forwards
2.5.2.14 proxy-Authorization
2.5.2.15 Range
此頭字段用於指定服務器只需要返回文檔的部分內容及內容范圍,這對比較大的文檔的斷點續傳比較有用.
2.5.2.16 Referer
表示跳轉到此頁面的前一個的URL.
2.5.2.17 TE
2.5.2.18 User-Agent
此頭字段用於指定瀏覽器或其他客戶端程序的類型和名稱,以便服務器針對不同類型的瀏覽器額返回不同的內容.
2.5.3 響應頭
響應頭字段用於服務器在響應消息中向客戶端傳遞附加信息,包括服務程序名,被請求資源需要的認證方式,被請求資源以移動到新地址信息等.
2.5.3.1 Accept-Range
此頭字段用於說明當前web服務器是否接受Range請求和Range請求中指定的數據單位.如果想告訴客戶機不要使用Range請求頭,則應使用下面的頭信息:
Accept-Range: none
如果服務器想告訴客戶機可以使用Range頭字段並且以byte為數據單位,則應使用如下頭信息:
Accept-Range: bytes
2.5.3.2 Age
此頭字段用於指出當前網頁文檔可以在客戶機或代理服務器中緩存的有效時間,設置的值是一個以毫秒為單位的時間數.例如:
Age:5257839257
2.5.3.3 Etag
此頭字段用於向客戶機傳送代表實體內容特征的標記信息,這些標記信息稱為實體標簽,用於比較在不同的時間獲得的統一資源路徑下的實體內容是否相等.
2.5.3.4 Location
此頭字段用於通知客戶機應該到哪個新的地址去獲取文檔. 狀態碼為:300~399的響應消息都應該使用Location頭字段將新的文檔地址告訴給客戶機,以便客戶機自動重新連接到新地址並檢索新文檔
2.5.3.5 Proxy-Anthenticate
2.5.3.6 Retry-After
此頭字段用於告訴客戶機可以在什么時間發出剛才的請求,需要與503結合使用.
2.5.3.7 Server
Server頭字段用於指定服務器軟件的產品名稱,例如:
Server: Microsoft -IIS /5.0
2.5.3.8 Vary
Vary頭字段用於指定影響了服務器所生成的響應內容的那些請求頭字段名,例如:
Vary:Accept-Language
2.5.4 實體頭
實體頭是實體內容的元信息,描述實體內容的屬性,包括實體信息類型,長度,壓縮方法,最后一次修改時間,數據有效期等
2.5.4.1 Allow
此頭字段用於指定客戶端請求資源所支持的請求方法(如GET,POST等),它通常伴隨着405響應狀態碼一起使用.
2.5.4.2 Content-Encoding
此頭字段用於指定實體內容的壓縮編碼方式. Content-Type響應頭字段中指定的MiMe類型是指定實體內容壓縮編碼前的類型;
2.5.4.3 Content-Language
此頭字段用於指定返回網頁文檔的國家語言類型.
2.5.4.4 Content-Length
此頭字段用於表示實體內容的長度,瀏覽器與web服務器之間使用持久的HTTP連接時,這個頭字段在非chunked傳輸編碼的響應消息中是必不可少的.
2.5.4.5 Content-Location
此頭字段用於指定響應消息鎖封裝的實體內容的實際位置路徑.
2.5.4.6 Content-MD5
2.5.4.7 Content-Range
此頭字段用於指定服務器返回部分實體內容的位置信息.
2.5.4.8 Content-type
2.5.4.9 Expires
此頭字段用於指定當前文檔應該在什么時候被認為過期. 例如:
Expires: 0
2.5.4.10 Last-Modified
此頭字段用於指定文檔的最后修改時間.
2.5.5 擴展頭
2.5.5.1 Refresh
此頭字段用於告訴瀏覽器過多少秒后自動刷新頁面,例如:
Refresh: 3 //過三秒刷新頁面
Refresh: 3;www.baidu.com //過三秒跳轉到百度首頁
2.5.5.2 Content-Disposition