(JavaEE-03)HTTP協議

#http協議 什麼是http協議?客戶端連上web服務器後,若是想獲取web服務器中的某個web資源,就須要遵照必定的通信格式,http協議就是用於定義客戶端與服務器之間的通信格式。html

  • http是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於定義web瀏覽器與web服務器之間交換數據的過程。
  • 深刻學習http協議是學好web開發的一個重要前提!
  • http協議的版本:http/1.0、http/1.1

(使用telnet演示,ctrl+],讓回顯正常顯示)web

###http1.0與http1.1apache

在http1.0協議中,客戶端與服務器創建鏈接後,只能獲取一個web資源。 http1.1協議,容許客戶端與web服務器創建鏈接後,在一個鏈接上獲取多個資源。(使用telnet演示) 若是頁面上有對別的web資源的引用,那麼客戶端會屢次請求服務器,例如,有三張圖片,那麼就會一共請求四次(CSS精靈,優化程序)。瀏覽器

#http請求 客戶端連上服務器以後,向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個http請求。一個完整的http請求包括:緩存

  • 一個請求行
  • 若干消息頭
  • 實體內容

GET /aaa/1.html HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-us,zh-cn;q=0.8,zh;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DNT: 1 Connection: keep-alive If-Modified-Since: Fri, 13 Jun 2014 23:27:47 GMT If-None-Match: W/"268-1402702067708" Cache-Control: max-age=0tomcat

請求行:用於描述客戶端的請求方式、請求資源的名稱,以及使用HTTP協議版本號 消息頭:用於描述客戶端請求哪臺主機,以及客戶端的一些環境信息等 實體內容:在此次請求中所攜帶的數據(消息頭與實體內容中有一個空行)安全

###請求行 請求行中的GET稱爲請求方式,請求方式有:服務器

  • POST、GET、HEAD、OPTIONS、DELETE、PUT
  • 經常使用的有:GET、POST
  • 用戶若是沒有設置,默認狀況下瀏覽器向服務器發送的都是get請求。(直接在地址欄輸入地址訪問,點擊超連接訪問,表單訪問)

POST和GET,都用於向服務器請求某個資源,這兩種方式的區別主要表如今數據傳遞上:app

  • 若是請求方式是GET,那麼能夠在請求的URL地址後面以 ? 的形式帶上交給服務器的數據,多個數據之間用 & 分隔(GET /aaa/1.html?name=jack&pwd=123)
  • GET方式這種附帶參數是有限制的,其數據容量不能超過1K(不安全)
  • 若是使用POST請求,則能夠在請求的實體內容中(負載)向服務器發送數據,並且數量不限(安全)

###消息頭 經常使用的消息頭:jsp

  • Accept : text/html,image/* 告訴服務器,客戶端所支持的類型
  • Accept-Charset : ISO=8859-1 客戶端採用的編碼表
  • Accept-Encoding : gzip,compress 客戶端所支持的數據壓縮格式
  • Accept-Language : en-us,zh-cn 客戶端的語言環境(國際化)
  • Host : www.xinsiku.com:80 客戶端想訪問的主機
  • If-Modified-Since: Fri, 13 Jun 2014 23:27:47 GMT 客戶端對於資源的最後緩存時間
  • Referer : http://www.xinsiku.com/index.jsp 告知服務端,客戶端是從哪一個頁面去訪問服務器的(防盜鏈)
  • User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 客戶端的機器環境(使用的操做系統,瀏覽器,版本號等)
  • Cookie 給服務器帶一些數據
  • Connection: close/keep-alive 告訴服務器,請求完以後,是保存鏈接仍是關閉鏈接
  • Date : Fri, 13 Jun 2014 23:27:47 GMT 請求時間值

#http響應 一個http響應表明服務器向客戶端返回的數據,它包括:

  • 一個狀態行,用於描述服務器對請求的處理結果
  • 若干消息頭,消息頭用於描述服務器的基本信息,以及數據的描述,服務器經過這些數據的描述信息,能夠通知客戶端如何處理等一會返回的數據
  • 以及實體內容,服務器向客戶端返回的數據(實體內容與消息頭中間有一個空行)

HTTP/1.1 200 OK (304 Not Modified)
Server : Apache-Coyote/1.1 Etag : W/"268-1402702066000" Date : Sat, 14 Jun 2014 03:45:49 GMT Accept-Ranges : bytes Content-Length : 268 Content-Type : text/html Date : Sat, 14 Jun 2014 03:47:34 GMT Etag : W/"268-1402702066000" Last-Modified : Fri, 13 Jun 2014 23:27:46 GMT Server : Apache-Coyote/1.1

###狀態行 格式:HTTP版本號 狀態碼 緣由敘述<CRLF> 舉例:HTTP/1.1 200 OK 狀態碼用於表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分爲5類:

100~199 表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程(不多見) 200~299 表示成功接收請求並已完成整個處理過程,經常使用200 300~399 爲完成請求,客戶須要進一步細化請求。例如:請求的資源已經移動一個新地址,經常使用302(讓請求去找別的資源)、307和304(讓客戶端去拿緩存) 400~499 客戶端請求有錯誤,經常使用 404 500~599 服務器端出現錯誤,經常使用500

###響應頭 http響應經常使用響應頭:

  • Location: http://xinsiku/index.jsp 這個頭一般和302一塊兒使用,告訴客戶端去找別的資源 (demo)
  • Server: apache tomcat 告訴瀏覽器服務器的類型
  • Content-Encoding: gzip 告訴瀏覽器數據的壓縮格式(gzip,減小流量,提高性能)(demo)
  • Content-Length: 80 告訴瀏覽器返回數據的長度
  • Content-Language: zh-cn 語言環境
  • Content-Type: text/html; charset=GB2312 返回數據的類型和編碼 (demo)
  • Last-Modified: Fri, 13 Jun 2014 23:27:46 GMT 數據的最後修改時間(跟緩存相關)
  • Refresh: 1;url=http://www.xinsiku.com 多長時間定時刷新(服務器經過這個頭來控制瀏覽器行爲)(demo)
  • Content-Disposition: attachment; filename=aaa.zip 用下載的方式打開返回的數據(提示用戶下載)(demo)
  • Transfer-Encoding: chunked 告訴瀏覽器,數據是以塊的方式傳輸的
  • Set-Cookie:SS=Q0=5Lb_nQ; path=/search 控制Cookie與Session相關(後面有專題講)
  • ETag: W/"7777-1242234904000" 給網頁生成一個編號(作緩存用,單位能夠到毫秒級別,Modified相關的只能到秒級別,高性能網站才須要相關開發)
  • Expires: -1 作緩存相關設置(-1或0 不要緩存,也能夠設置緩存時間,如:2014 08 09,該設置是基於這次返回數據的,對別的資源沒有效果)
  • Cache-Control: no-cache 設置緩存
  • Pragma: no-cache 設置緩存(針對不一樣的瀏覽器開發商,對緩存的設置,這三個設置一塊兒用)
  • Connection: close/Keep-Alive
  • Date: Fri, 13 Jun 2014 23:27:46 GMT

在實際開發中,咱們是不須要編寫這些複雜的頭信息的,由於在JavaEE中已經封裝了不少針對不一樣請求和響應的處理對象,直接調用相對應的API就能夠了,可是隻要清楚了響應頭,咱們也能夠本身去編寫一些響應程序,並且對於響應對象的理解也更加容易。

###Range頭(斷點續傳)(demo)

  • HTTP請求頭字段

Range頭指示服務器只傳輸一部分web資源。這個頭能夠用來實現斷點續傳功能。Renge字段能夠經過三種格式設置傳輸的字節範圍:

Range : bytes=1000-200 (傳輸範圍從1000到2000字節) Range : bytes=1000- (從1000個字節之後的全部內容) Range : bytes=1000 (傳輸最後1000個字節)

  • HTTP響應消息頭字段

Accept-Ranges: 表示知否支持Renge,若是支持,返回:Accept-Ranges: bytes,若是不支持,返回:Accept-Ranges: none Content-Range : 返回的Web資源的字節範圍,如:Content-Range : 1000-3000/5000(表示本次返回資源的1000到3000字節的數據,總共5000字節)

相關文章
相關標籤/搜索