HTTP請求/響應報文結構

HTTP請求報文html

一個HTTP請求報文由四個部分組成:請求行、請求頭部、空行、請求數據。web

1.請求行瀏覽器

請求行由請求方法字段、URL字段和HTTP協議版本字段3個字段組成,它們用空格分隔。好比 GET /data/info.html HTTP/1.1緩存

方法字段就是HTTP使用的請求方法,好比常見的GET/POST安全

其中HTTP協議版本有兩種:HTTP1.0/HTTP1.1 能夠這樣區別:服務器

HTTP1.0對於每一個鏈接都只能傳送一個請求和響應,請求就會關閉,HTTP1.0沒有Host字段;而HTTP1.1在同一個鏈接中能夠傳送多個請求和響應,多個請求能夠重疊和同時進行,HTTP1.1必須有Host字段。函數

2.請求頭部post

HTTP客戶程序(例如瀏覽器),向服務器發送請求的時候必須指明請求類型(通常是GET或者 POST)。若有必要,客戶程序還能夠選擇發送其餘的請求頭。大多數請求頭並非必需的,但Content-Length除外。對於POST請求來講 Content-Length必須出現。編碼

常見的請求頭字段含義:加密

Accept: 瀏覽器可接受的MIME類型。

Accept-Charset:瀏覽器可接受的字符集。

Accept-Encoding:瀏覽器可以進行解碼的數據編碼方式,好比gzip。Servlet可以向支持gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這能夠減小5到10倍的下載時間。

Accept-Language:瀏覽器所但願的語言種類,當服務器可以提供一種以上的語言版本時要用到。

Authorization:受權信息,一般出如今對服務器發送的WWW-Authenticate頭的應答中。

Content-Length:表示請求消息正文的長度。

Host: 客戶機經過這個頭告訴服務器,想訪問的主機名。Host頭域指定請求資源的Intenet主機和端口號,必須表示請求url的原始服務器或網關的位置。HTTP/1.1請求必須包含主機頭域,不然系統會以400狀態碼返回。

If-Modified-Since:客戶機經過這個頭告訴服務器,資源的緩存時間。只有當所請求的內容在指定的時間後又通過修改才返回它,不然返回304「Not Modified」應答。

Referer:客戶機經過這個頭告訴服務器,它是從哪一個資源來訪問服務器的(防盜鏈)。包含一個URL,用戶從該URL表明的頁面出發訪問當前請求的頁面。

User-Agent:User-Agent頭域的內容包含發出請求的用戶信息。瀏覽器類型,若是Servlet返回的內容與瀏覽器類型有關則該值很是有用。

Cookie:客戶機經過這個頭能夠向服務器帶數據,這是最重要的請求頭信息之一。

Pragma:指定「no-cache」值表示服務器必須返回一個刷新後的文檔,即便它是代理服務器並且已經有了頁面的本地拷貝。

From:請求發送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它。

Connection:處理完此次請求後是否斷開鏈接仍是繼續保持鏈接。若是Servlet看到這裏的值爲「Keep- Alive」,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久鏈接),它就能夠利用持久鏈接的優勢,當頁面包含多個元素時(例如Applet,圖片),顯著地減小下載所須要的時間。要實現這一點,Servlet須要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入 ByteArrayOutputStream,而後在正式寫出內容以前計算它的大小。

Range:Range頭域能夠請求實體的一個或者多個子範圍。例如,

表示頭500個字節:bytes=0-499

表示第二個500字節:bytes=500-999

表示最後500個字節:bytes=-500

表示500字節之後的範圍:bytes=500-

第一個和最後一個字節:bytes=0-0,-1

同時指定幾個範圍:bytes=500-600,601-999

可是服務器能夠忽略此請求頭,若是無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是以200 (OK)。

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發送的非標準的請求頭,表示屏幕大小、顏色深度、操做系統和CPU類型。

3.空行

它的做用是經過一個空行,告訴服務器請求頭部到此爲止。

4.請求數據

若方法字段是GET,則此項爲空,沒有數據

若方法字段是POST,則一般來講此處放置的就是要提交的數據

好比要使用POST方法提交一個表單,其中有user字段中數據爲「admin」, password字段爲123456,那麼這裏的請求數據就是 user=admin&password=123456,使用&來鏈接各個字段。

總的來講,HTTP請求報文格式就以下圖所示

 

這裏寫圖片描述

 

 

這裏寫圖片描述

 

上面是POST方法,它的請求行URL段中通常是沒有參數的,參數放在了報文體中。而GET方法的參數直接置於請求行URL中,報文體則爲空。

HTTP響應報文

一樣的,HTTP響應報文也由三部分組成:響應行、響應頭、響應體

1.響應行

響應行通常由協議版本、狀態碼及其描述組成 好比 HTTP/1.1 200 OK

其中協議版本HTTP/1.1或者HTTP/1.0,200就是它的狀態碼,OK則爲它的描述。

//常見狀態碼:

100~199:表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程。

200~299:表示成功接收請求並已完成整個處理過程。經常使用200

300~399:爲完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、經常使用302(意味着你請求我,我讓你去找別人),307和304(我不給你這個資源,本身拿緩存)

400~499:客戶端的請求有錯誤,經常使用404(意味着你請求的資源在web服務器中沒有)403(服務器拒絕訪問,權限不夠)

500~599:服務器端出現錯誤,經常使用500

更詳細的狀態碼信息

2.響應頭

響應頭用於描述服務器的基本信息,以及數據的描述,服務器經過這些數據的描述信息,能夠通知客戶端如何處理等一下子它回送的數據。

設置HTTP響應頭每每和狀態碼結合起來。例如,有好幾個表示「文檔位置已經改變」的狀態代碼都伴隨着一個Location頭,而401(Unauthorized)狀態代碼則必須伴隨一個WWW-Authenticate頭。然而,即便在沒有設置特殊含義的狀態代碼時,指定應答頭也是頗有用的。應答頭能夠用來完成:設置Cookie,指定修改日期,指示瀏覽器按照指定的間隔刷新頁面,聲明文檔的長度以便利用持久HTTP鏈接,……等等許多其餘任務。

常見的響應頭字段含義:

Allow:服務器支持哪些請求方法(如GET、POST等)。

Content-Encoding:文檔的編碼(Encode)方法。只有在解碼以後才能夠獲得Content-Type頭指定的內容類型。利用gzip壓縮文檔可以顯著地減小HTML文檔的下載時間。Java的GZIPOutputStream能夠很方便地進行gzip壓縮,但只有Unix上的Netscape和Windows上的IE四、IE5才支持它。所以,Servlet應該經過查看Accept-Encoding頭(即request.getHeader(「Accept- Encoding」))檢查瀏覽器是否支持gzip,爲支持gzip的瀏覽器返回經gzip壓縮的HTML頁面,爲其餘瀏覽器返回普通頁面。

Content-Length:表示內容長度。只有當瀏覽器使用持久HTTP鏈接時才須要這個數據。若是你想要利用持久鏈接的優點,能夠把輸出文檔寫入 ByteArrayOutputStram,完成後查看其大小,而後把該值放入Content-Length頭,最後經過byteArrayStream.writeTo(response.getOutputStream()發送內容。

Content- Type:表示後面的文檔屬於什麼MIME類型。Servlet默認爲text/plain,但一般須要顯式地指定爲text/html。因爲常常要設置 Content-Type,所以HttpServletResponse提供了一個專用的方法setContentType。

Date:當前的GMT時間,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,換算成本地時間,須要知道用戶所在的時區。你能夠用setDateHeader來設置這個頭以免轉換時間格式的麻煩。

Expires:告訴瀏覽器把回送的資源緩存多長時間,-1或0則是不緩存。

Last-Modified:文檔的最後改動時間。客戶能夠經過If-Modified-Since請求頭提供一個日期,該請求將被視爲一個條件GET,只有改動時間遲於指定時間的文檔纔會返回,不然返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設置。

Location:這個頭配合302狀態碼使用,用於重定向接收者到一個新URI地址。表示客戶應當到哪裏去提取文檔。Location一般不是直接設置的,而是經過HttpServletResponse的sendRedirect方法,該方法同時設置狀態代碼爲302。

Refresh:告訴瀏覽器隔多久刷新一次,以秒計。

Server:服務器經過這個頭告訴瀏覽器服務器的類型。Server響應頭包含處理請求的原始服務器的軟件信息。此域能包含多個產品標識和註釋,產品標識通常按照重要性排序。Servlet通常不設置這個值,而是由Web服務器本身設置。

Set-Cookie:設置和頁面關聯的Cookie。Servlet不該使用response.setHeader(「Set-Cookie」, …),而是應使用HttpServletResponse提供的專用方法addCookie。

Transfer-Encoding:告訴瀏覽器數據的傳送格式。

WWW-Authenticate:客戶應該在Authorization頭中提供什麼類型的受權信息?在包含401(Unauthorized)狀態行的應答中這個頭是必需的。例如,response.setHeader(「WWW-Authenticate」, 「BASIC realm=\」executives\」「)。注意Servlet通常不進行這方面的處理,而是讓Web服務器的專門機制來控制受密碼保護頁面的訪問。

注:設置應答頭最經常使用的方法是HttpServletResponse的setHeader,該方法有兩個參數,分別表示應答頭的名字和值。和設置狀態代碼類似,設置應答頭應該在發送任何文檔內容以前進行。

setDateHeader方法和setIntHeadr方法專門用來設置包含日期和整數值的應答頭,前者避免了把Java時間轉換爲GMT時間字符串的麻煩,後者則避免了把整數轉換爲字符串的麻煩。

HttpServletResponse還提供了許多設置

setContentType:設置Content-Type頭。大多數Servlet都要用到這個方法。

setContentLength:設置Content-Length頭。對於支持持久HTTP鏈接的瀏覽器來講,這個函數是頗有用的。

addCookie:設置一個Cookie(Servlet API中沒有setCookie方法,由於應答每每包含多個Set-Cookie頭)。

3.響應體

響應體就是響應的消息體,若是是純數據就是返回純數據,若是請求的是HTML頁面,那麼返回的就是HTML代碼,若是是JS就是JS代碼,如此之類。

HTTP響應報文格式就以下圖所示

 

這裏寫圖片描述

 

通用頭、實體頭

HTTP的頭域包括通用頭,請求頭,響應頭和實體頭四個部分。前面講解了請求頭和響應頭,接下來看看通用頭和實體頭(這裏可能和前面介紹的請求頭、響應頭有重複)。

(1)通用頭域

通用頭域包含請求和響應消息都支持的頭域,通用頭域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴展要求通信雙方都支持此擴展,若是存在不支持的通用頭域,通常將會做爲實體頭域處理。下面簡單介紹幾個通用頭域。

常見通用頭含義:

Cache-Control:指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置 Cache-Control並不會修改另外一個消息處理過程當中的緩存處理過程。請求時的緩存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各個消息中的指令含義以下:

Public指示響應可被任何緩存區緩存。 Private指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這容許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其餘用戶的請求無效。 no-cache指示請求或響應消息不能緩存 no-store用於防止重要的信息被無心的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存。 max-age指示客戶機能夠接收生存期不大於指定時間(以秒爲單位)的響應。 min-fresh指示客戶機能夠接收響應時間小於當前時間加上指定時間的響應。 max-stale指示客戶機能夠接收超出超時期間的響應消息。若是指定max-stale消息的值,那麼客戶機能夠接收超出超時期指定值以內的響應消息。

Date:表示消息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,換算成本地時間,須要知道用戶所在的時區。

Pragma:用來包含實現特定的指令,最經常使用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache-Control:no-cache相同。

(2)實體頭域

請求消息和響應消息均可以包含實體信息,實體信息通常由實體頭域和實體組成。實體頭域包含關於實體的原信息,實體頭包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD五、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header容許客戶端定義新的實體頭,可是這些域可能沒法未接受方識別。實體能夠是一個通過編碼的字節流,它的編碼方式由Content-Encoding或Content-Type定義,它的長度由Content-Length或Content-Range定義。

常見實體頭含義:

Content-Encoding: 服務器經過這個頭告訴瀏覽器數據的壓縮格式。

Content-Length: 服務器經過這個頭告訴瀏覽器回送數據的長度。

Content-Disposition:告訴瀏覽器如下載方式打開數據。

Content-Type:服務器經過這個頭告訴瀏覽器回送數據的類型。Content-Type實體頭用於向接收方指示實體的介質類型,指定HEAD方法送到接收方的實體介質類型,或GET方法發送的請求介質類型。

Content-Range:用於指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在服務器向客戶返回一個部分響應,它必須描述響應覆蓋的範圍和整個實體長度。通常格式:

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth

例如,傳送頭500個字節次字段的形式:Content-Range:bytes0- 499/1234,若是一個http消息包含此節(例如,對範圍請求的響應或對一系列範圍的重疊請求),Content-Range表示傳送的範圍, Content-Length表示實際傳送的字節數。

Last-Modified:指定服務器上保存內容的最後修訂時間。

ETag:緩存相關的頭

Expires:告訴瀏覽器把回送的資源緩存多長時間 -1或0則是不緩存

其中三種禁止瀏覽器緩存的頭字段:

Expires:-1或0

Cache-Control:no-cache

Pragma:no-cache

GET、POST區別

Http定義了與服務器交互的不一樣方法,最基本的方法有4種:GET、POST、PUT、DELETE。

而HTTP中的 GET,POST,PUT,DELETE 就對應着對URL資源的 查,改,增,刪 4個操做。因此說:GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息。

主要區分一下get和post

1.提交數據的形式:

GET請求的數據會附在URL以後(就是把數據放置在HTTP協議頭中),會直接展示在地址欄中,以?分割URL和傳輸數據,參數之間以&相連,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。

若是數據是英文字母/數字,原樣發送,若是是空格,轉換爲+,若是是中文/其餘字符,則直接把字符串用BASE64加密

得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX爲該符號以16進製表示的ASCII。

而POST方法則會把數據放到請求數據字段中以&分隔各個字段,請求行不包含數據參數,地址欄也不會額外附帶參數

2.提交數據的大小

get方法提交數據的大小直接影響到了URL的長度,但HTTP協議規範中實際上是沒有對URL限制長度的,限制URL長度的是客戶端或服務器的支持的不一樣所影響:好比IE對URL長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系統的支持。

post方式HTTP協議規範中也沒有限定,起限制做用的是服務器的處理程序的處理能力。

因此大小的限制仍是得受各個web服務器配置的不一樣而影響。

3.提交數據的安全

POST比GET方式的安全性要高

經過GET提交數據,用戶名和密碼將明文出如今URL上,由於一下幾個緣由get方式安全性會比post弱:

(1)登陸頁面有可能被瀏覽器緩存

(2)其餘人查看瀏覽器的歷史紀錄,那麼別人就可 以拿到你的帳號和密碼了

(3)當趕上跨站的攻擊時,安全性的表現更差了

相關文章
相關標籤/搜索