Java web基礎總結之二——http協議
由於java web是基於B/S的,所以http協議是java web 最基礎,也非常重要的知識。HTTP協議用於定義客戶端與web服務器之間進行通信的格式。從web服務器中獲得某個web資源或者web 服務器接受客戶端的請求都需要遵守一定的通訊格式,就是http協議。
一.HTTP協議是什麼?
HTTP協議是學習java web的基石,同時也是管理和維護一些複雜的WEB站點的必備的基礎,如果你想要深入的理解java web的服務器的實現,就更需要掌握它。
HTTP是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是在TCP/IP協議之上的一個應用層協議,默認的端口是80,用於定義WEB瀏覽器與WEB服務器之間交換數據的格式和規範。
HTTP協議是無狀態的協議,是因爲一個web服務器並不會保存關於客戶機的任何的信息。在B/S架構中,web服務器總是打開的,具有固定的IP地址,同時服務成千上萬的不同的瀏覽器。
HTTP協議有兩個版本:HTTP/1.0、HTTP/1.1。現在基本使用的都是HTTP/1.1。他們之間有一個重要的區別:在HTTP1.0協議中,客戶端與web服務器建立連接後,只能獲得一個web資源。HTTP1.1協議,允許客戶端與web服務器建立連接後,在一個連接上獲取多個web資源。也就是常說的持久連接。
二.持久連接和非持久連接的區別
一個web頁面,也被稱爲文檔。是由對象組成的,簡單的說,對象就是文件,比如html文件,圖片文件等等。大部分的web頁面含有一個基本html文件以及多個引用對象。比如一個web頁面含有一個基本的html文件和2個圖片文件,那麼這個web頁面就有3個對象。基本html文件通過對象的URL地址對對象進行引用。URL地址由兩部分組成:存放對象的服務器的主機名和對象相對於主機的路徑名。例如:
http://c.csdnimg.cn/www/images/pic_foot_BNIA.png 中的 c.csdnimg.cn就是主機名,
/www/images/pic_foot_BNIA.png就是路徑名。
非持久連接就是當客戶端請求一個web頁面時,對每一個對象的請求/響應都是經過一個單獨的TCP連接發送。例如,如果一個web頁面包含一個基本html文件和5個JPEG的圖片文件。則使用非持久連接時,用戶請求這個頁面,會建立6個TCP連接。
持久連接則是對一個頁面的請求,甚至在同一個服務器上的多個web時,都可以在單個的持久TCP連接上進行傳送。比如上面的例子中,可能只需要一個持久的TCP連接。一般來說,如果一個連接經過一定的時間間隔沒有被使用,HTTP服務器就會關閉這個連接。
三.HTTP的請求
客戶端的瀏覽器連上web服務器後,會向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個HTTP請求。一個完整的HTTP請求包括:一個請求行、一些消息頭、和實體內容,其中的一些消息頭和實體內容都是可選的,消息頭和實體內容之間要用空行隔開。
1. 請求行
請求行中需要注意的是請求方式,主要有:
POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
我們常用的有:POST、GET 。其他的比較少遇到,這裏就不多敘述了。
POST或GET,都是用於客戶端向服務器請求某個WEB資源,他們都可以帶一些數據給服務器,但是他們有一定的區別:
如請求方式爲GET方式,則可以在請求的URL地址後以?的形式帶上交給服務器的數據,多個數據之間以&進行分隔,例如:
GET/aaa/bbb?name=ccc&password=ddd HTTP/1.1
GET方式的特點:在URL地址後附帶的參數是有限制的,其數據容量不能超過1K。可以看到,使用GET請求方式時,參數是顯示在瀏覽器的輸入框裏的,所以是可見的。
當請求方式爲POST方式,則可以在請求的實體內容中向服務器發送數據,例如:
POST /user/loginHTTP/1.1
Host:
Content-Type:application/x-www-form-urlencoded
Content-Length:28
name=aaa&password=bbb
Post方式的特點:傳送的數據量沒有大小的限制,而且參數不會在瀏覽器的地址框裏顯示。
2. 消息頭
http請求頭是必須存在的,它攜帶了很多的重要的信息,比如客戶端的瀏覽器的標識,下面是HTTP請求中的常用頭:
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: http://www.csdn.net:80
If-Modified-Since: Tue, 11 Jul 2010 18:23:51 GMT
Referer: http:// http://www.csdn.net
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2010 18:23:51 GMT
四.HTTP的響應
和HTTP的請求相對應,一個HTTP響應表示服務器向客戶端回送的數據,它也包括三個部分:一個狀態行、若干消息頭、以及實體內容,其中的一些消息頭和實體內容都是可選的,消息頭和實體內容之間要用一個空行作爲間隔。
狀態行中需要知道的就是狀態碼,狀態碼錶示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼總共分爲5類,如下所示:
100~199 |
表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程 |
200~299 |
表示成功接收請求並已完成整個處理過程,常用200 |
300~399 |
爲完成請求,客戶需進一步細化請求。例如,請求的資源已經移動一個新地址,常用302、307和304。比如304的重定向 |
400~499 |
客戶端的請求有錯誤,常用如403的禁止訪問和404的找不到資源 |
500~599 |
服務器出現錯誤,比如服務器端程序拋出了異常,常用 500。 |
和 HTTP請求頭一樣,HTTP也有一些常用的響應頭,如下所示:
Location: http:// www.csdn.net
Server:apache tomcat
Content-Encoding: gzip
Content-Length: 80
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2010 18:23:51 GMT
Refresh: 1;url=http://www.csdn.net
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/aaa
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
需要注意的是,有一些通用的消息頭,既可以用於請求,也可以用於響應,比如:
Cache-Control:no-cache 用於指定是否需要緩存
Pragma:no-cache Pragma: no-cache兼容http 1.0 ,Cache-Control:no-cache是http 1.1新加的消息頭。
Connection:close/Keep-Alive 這個就是控制是持久連接還是非持久連接。
Date: Tue, 11Jul 2000 18:23:51 GMT