http協定是位于應用層的協定,我們在日常浏覽網頁比如在導航網站請求百度首頁的時候,會先通過http協定把請求做一個類似于編碼的工作,發送給百度的伺服器,然後在百度伺服器響應請求時把相應的内容再通過http協定做一個類似于解碼的工作,這樣浏覽器才能了解這個資料,然後為我們展示出來百度首頁.
這相當于是一種規範,網絡中資料的傳輸在位于應用之下的各層(傳輸層,應用層)來完成的,在tcp/ip協定接收到資料時,我們是不能直接使用和浏覽的,需要先通過一種規範來進行梳理,也就是解碼,得到浏覽器支援的一種格式,才能被我們使用.
在web開發中,熟悉http協定中的封包結構是很重要的,比如,如果對http封包不熟悉,在使用httpServletRequest很多方法的時候,就會陷入懵逼.
http封包分為請求封包和響應封包.
請求封包(request message)
請求封包分為三部分:首行,請求頭,請求體.
首行包括:請求類型,URL,HTTP版本.
請求頭部儲存一些鍵值對的屬性.
請求體儲存具體内容,一般為POST類型的參數.
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuMjYhdzN3gDO3UTZhFjYzkTYhNGOiVmY0gTOxUTNlNWYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
常見的HTTP請求頭屬性
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept:告訴服務端,該請求所能支援的響應資料類型,專業術語稱為MIME 類型,上圖中表示支援text/html的響應格式.
擴充:text/html,application/xhtml+xml,application/xml 都是 MIME 類型,也可以稱為媒體類型和内容類型,斜杠前面的是 type(類型),斜杠後面的是 subtype(子類型)
Cookie:seraph.confluence=6389808%3A04c906749aac37bbfe595ff3149ac5c17bfcd298;Hm_lvt_4a7d8ec50cfd6af753c4f8aee3425070=1477401172,1479201037,1479895114; _ga=GA1.2.1021401543.1477401172; JSESSIONID=6C331887C562AF7839384C41D590CA9A;
Cookie:将用戶端的cookie放在請求頭裡一并發送給伺服器端.
這裡就出了一個問題,網站A怎麼保證自己請求體中儲存的cookie就是網站A的cookie而不是網站B的cookie呢,這就和cookie裡面的jsessionid有關系了,關于cookie,session,sessionid,jsessionid的差別聯系,可以參考這個博文
http://www.cnblogs.com/fnng/archive/2012/08/14/2637279.htmlreferer:https://www.baidu.com/linkurl=fjKPqTaoZV2a2g2H2kbBwdz0mgBgI06WLrVLrQhiKgu&wd=&eqid=841d77d20000a7ae00000004586b7070
Referer:表示這個請求是從哪個url跳過來的,通過百度來搜尋淘寶網,那麼在進入淘寶網的請求封包中,Referer的值就是:www.baidu.com
Cache-Control:max-age=0
Cache-control:對服務端傳回的相應内容進行緩存控制,即是否需要在用戶端儲存下來,如上表示不緩存.
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
User-Agent:使用者代理,簡稱 UA,是一個特殊字元串頭,使得伺服器能夠識别用戶端使用的作業系統及版本、CPU 類型、浏覽器及版本、浏覽器渲染引擎、浏覽器語言、浏覽器插件等資訊
Connection:keep-alive
Connection:表示用戶端與服務連接配接類型;Keep-Alive表示持久連接配接
更多請求頭屬性可以參考這篇文章:
HTTP響應頭和請求頭資訊對照表響應封包(response message)
響應封包也由三部分組成,首行,響應頭,響應體.
首行分為封包協定及版本,響應碼及狀态描述
狀态碼
1XX:資訊性狀态碼
2XX:成功狀态碼,200 表示成功
3XX:重定向狀态碼
4XX:用戶端錯誤狀态碼,404表示沒有找到請求的資源
5XX:伺服器端錯誤狀态碼,500表示内部錯誤
關于響應封包的響應頭屬性,可以詳見上面那個對照表連結.
需要提一下的是,我們可以通過HttpServletResponse的setHeader()方法來自行添加響應頭屬性.