2013.08 場(chǎng)景:最近,,將做一個(gè)SSO單點(diǎn)登錄的功能,,在本地實(shí)現(xiàn)本地認(rèn)證,服務(wù)器遠(yuǎn)程認(rèn)證,,遠(yuǎn)程訪問(wèn)認(rèn)證等功能,。其中涉及HTTP消息頭,大量的消息頭字符串讓我頭暈眼花,,不明白具體指什么東西,,所以總結(jié)HTTP消息頭,為自己充電,。好了,,不多說(shuō)了開(kāi)始說(shuō)正題... ...
HTTP 頭參考
HTTP 請(qǐng)求和 HTTP 響應(yīng)都使用頭發(fā)送有關(guān) HTTP 消息的信息。頭由一系列行組成,,每行都包含名稱,,然后依次是冒號(hào)、空格,、值,。字段可按任何順序排列。某些頭字段既能用于請(qǐng)求頭也能用于響應(yīng)頭,,而另一些頭字段只能用于其中之一,。
許多請(qǐng)求頭字段都允許客戶端在值部分指定多個(gè)可接受的選項(xiàng),有時(shí)甚至可以對(duì)這些選項(xiàng)的首選項(xiàng)進(jìn)行排名,。多個(gè)項(xiàng)以逗號(hào)分隔,。例如,客戶端可以發(fā)送包含“Content-Encoding: gzip, compress,”的請(qǐng)求頭,,表示可以接受各種壓縮類型,。如果服務(wù)器的響應(yīng)正文使用 gzip 編碼,,其響應(yīng)頭中將包含“Content-Encoding: gzip”,。
有些字段可以在單個(gè)頭中出現(xiàn)多次,。例如,頭可以有多個(gè)“Warning”字段,。
下表列出了 HTTP 1.1 頭字段,。注意:有些頭字段是 MIME 字段。MIME 字段在 Internet Engineering Task Force (IETF) 文檔 RFC 2045 中進(jìn)行了定義,,但也可用于 HTTP 1.1 協(xié)議,。有關(guān) MIME 和 HTTP 1.1 規(guī)范的詳細(xì)信息,請(qǐng)參閱 IEIF 頁(yè),。
一般頭字段
一般頭字段可用于請(qǐng)求消息和響應(yīng)消息,。
名稱
|
示例值
|
Cache-Control
|
"max-age=10"
|
Connection
|
"close"
|
Date
|
"Tue, 11 Jul 2000 18:23:51 GMT"
|
Pragma
|
"no-cache"
|
Trailer
|
"Date"
|
Transfer-Encoding
|
"chunked"
|
Upgrade
|
"SHTTP/1.3"
|
Via
|
"HTTP/1.1 Proxy1, HTTP/1.1 Proxy2"
|
Warning
|
"112 Disconnected Operation"
|
請(qǐng)求頭字段
請(qǐng)求頭字段僅用于請(qǐng)求消息。
名稱
|
示例值
|
Accept
|
"text/html, image/*"
|
Accept-Charset
|
"iso8859-5"
|
Accept-Encoding
|
"gzip, compress"
|
Accept-Language
|
"en, fr"
|
Authorization
|
[credentials]
|
Content-Encoding
|
"gzip"
|
Expect
|
"100-continue"
|
From
|
"[email protected]"
|
Host
|
"www.microsoft.com"
|
If-Match
|
"entity_tag001"
|
If-Modified-Since
|
"Tue, 11 Jul 2000 18:23:51 GMT"
|
If-None-Match
|
"entity_tag001"
|
If-Range
|
"entity_tag001" or "Tue, 11 Jul 2000 18:23:51 GMT"
|
If-Unmodified-Since
|
"Tue, 11 Jul 2000 18:23:51 GMT"
|
Max-Forwards
|
"3"
|
Proxy-Authorization
|
[credentials]
|
Range
|
"bytes=100-599"
|
Referer
|
"http://www.microsoft.com/resources.asp"
|
TE
|
"trailers"
|
User-Agent
|
"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"
|
響應(yīng)頭字段
響應(yīng)頭字段僅用于響應(yīng)消息,。
名稱
|
示例值
|
Accept-Ranges
|
"none"
|
Age
|
"2147483648(2^31)"
|
ETag
|
"b38b9-17dd-367c5dcd"
|
Last-Modified
|
"Tue, 11 Jul 2000 18:23:51 GMT"
|
Location
|
"http://localhost/redirecttarget.asp"
|
Proxy-Authenticate
|
[challenge]
|
Retry-After
|
"Tue, 11 Jul 2000 18:23:51 GMT" or "60"
|
Server
|
"Microsoft-IIS/5.0"
|
Vary
|
"Date"
|
WWW-Authenticate
|
[challenge]
|
實(shí)體頭字段
實(shí)體頭字段可以用于請(qǐng)求消息或響應(yīng)消息,。實(shí)體頭字段中包含消息實(shí)體正文的有關(guān)信息,如使用的編碼格式,。
名稱
|
示例值
|
Allow
|
"GET, HEAD"
|
Content-Encoding
|
"gzip"
|
Content-Language
|
"en"
|
Content-Length
|
"8445"
|
Content-Location
|
"http://localhost/page.asp"
|
Content-MD5
|
[md5-digest]
|
Content-Range
|
"bytes 2543-4532/7898"
|
Content-Type
|
"text/html"
|
Expires
|
"Tue, 11 Jul 2000 18:23:51 GMT"
|
Last-Modified
|
"Tue, 11 Jul 2000 18:23:51 GMT"
|
請(qǐng)求頭示例
以下是 HTTP 請(qǐng)求的簡(jiǎn)單示例,。
GET /articles/news/today.asp HTTP/1.1
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Accept-Encoding: gzip, deflate
該請(qǐng)求具有請(qǐng)求行,其中包括方法 (GET),、資源路徑 (/articles/news/today.asp) 和 HTTP 版本 (HTTP/1.1),。由于該請(qǐng)求沒(méi)有正文,故所有請(qǐng)求行后面的內(nèi)容都是頭的一部分,。緊接著頭之后是一個(gè)空行,,表示頭已結(jié)束。
響應(yīng)頭示例
Web 服務(wù)器可以通過(guò)多種方式響應(yīng)前一個(gè)請(qǐng)求,。假設(shè)文件是可以訪問(wèn)的,,并且用戶具有查看該文件的權(quán)限,則響應(yīng)類似于:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thu, 13 Jul 2000 05:46:53 GMT
Content-Length: 2291
Content-Type: text/html
Set-Cookie: ASPSESSIONIDQQGGGNCG=LKLDFFKCINFLDMFHCBCBMFLJ; path=/
Cache-control: private
<HTML>
<BODY>
...
響應(yīng)的第一行稱為狀態(tài)行,。它包含響應(yīng)所用的 HTTP 版本,、狀態(tài)編碼 (200) 和原因短語(yǔ)。示例中包含一個(gè)頭,,其中具有五個(gè)字段,,接著是一個(gè)空行(回車和換行符),然后是響應(yīng)正文的頭兩行,。
HTTP請(qǐng)求頭概述 HTTP客戶程序(例如瀏覽器),,向服務(wù)器發(fā)送請(qǐng)求的時(shí)候必須指明請(qǐng)求類型(一般是GET或者POST)。如有必要,,客戶程序還可以選擇發(fā)送其他的請(qǐng)求頭,。大多數(shù)請(qǐng)求頭并不是必需的,但Content- Length除外,。對(duì)于POST請(qǐng)求來(lái)說(shuō)Content-Length必須出現(xiàn),。 下面是一些最常見(jiàn)的請(qǐng)求頭
Accept:瀏覽器可接受的MIME類型,。
Accept-Charset:瀏覽器可接受的字符集。
Accept-Encoding:瀏覽器能夠進(jìn)行解碼的數(shù)據(jù)編碼方式,,比如gzip,。Servlet能夠向支持gzip的瀏覽器返回經(jīng)gzip編碼的HTML頁(yè)面。許多情形下這可以減少5到10倍的下載時(shí)間,。
Accept-Language:瀏覽器所希望的語(yǔ)言種類,,當(dāng)服務(wù)器能夠提供一種以上的語(yǔ)言版本時(shí)要用到。
Authorization:授權(quán)信息,,通常出現(xiàn)在對(duì)服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中,。
Connection:表示是否需要持久連接。如果Servlet看到這里的值為"Keep-Alive",,或者看到請(qǐng)求使用的是HTTP 1.1 (HTTP 1.1默認(rèn)進(jìn)行持久連接),,它就可以利用持久連接的優(yōu)點(diǎn),當(dāng)頁(yè)面包含多個(gè)元素時(shí)(例如Applet,,圖片),,顯著地減少下載所需要的時(shí)間。要實(shí)現(xiàn)這一點(diǎn),,Servlet需要在應(yīng)答中發(fā)送一個(gè)Content-Length頭,,最簡(jiǎn)單的實(shí)現(xiàn)方法是:先把內(nèi)容寫入 ByteArrayOutputStream,然后在正式寫出內(nèi)容之前計(jì)算它的大小,。
Content-Length:表示請(qǐng)求消息正文的長(zhǎng)度,。
Cookie:這是最重要的請(qǐng)求頭信息之一
From:請(qǐng)求發(fā)送者的email地址,由一些特殊的Web客戶程序使用,,瀏覽器不會(huì)用到它,。
Host:初始URL中的主機(jī)和端口。
If-Modified-Since:只有當(dāng)所請(qǐng)求的內(nèi)容在指定的日期之后又經(jīng)過(guò)修改才返回它,,否則返回304"Not Modified"應(yīng)答,。
Pragma:指定"no-cache"值表示服務(wù)器必須返回一個(gè)刷新后的文檔,即使它是代理服務(wù)器而且已經(jīng)有了頁(yè)面的本地拷貝,。
Referer:包含一個(gè)URL,,用戶從該URL代表的頁(yè)面出發(fā)訪問(wèn)當(dāng)前請(qǐng)求的頁(yè)面。
User-Agent:瀏覽器類型,,如果Servlet返回的內(nèi)容與瀏覽器類型有關(guān)則該值非常有用,。
UA-Pixels,UA-Color,,UA-OS,,UA-CPU:由某些版本的IE瀏覽器所發(fā)送的非標(biāo)準(zhǔn)的請(qǐng)求頭,表示屏幕大小、顏色深度,、操作系統(tǒng)和CPU類型,。
有關(guān)HTTP頭完整、詳細(xì)的說(shuō)明,,請(qǐng)參見(jiàn)http://www./Protocols/的HTTP規(guī)范,。
—————————————————————————————————————————————— HTTP應(yīng)答頭概述(HttpServletResponse) Web服務(wù)器的HTTP應(yīng)答一般由以下幾項(xiàng)構(gòu)成:一個(gè)狀態(tài)行,,一個(gè)或多個(gè)應(yīng)答頭,,一個(gè)空行,內(nèi)容文檔,。設(shè)置HTTP應(yīng)答頭往往和設(shè)置狀態(tài)行中的狀態(tài)代碼結(jié)合起來(lái),。例如,有好幾個(gè)表示"文檔位置已經(jīng)改變"的狀態(tài)代碼都伴隨著一個(gè)Location頭,,而401(Unauthorized)狀態(tài)代碼則必須伴隨一個(gè)WWW-Authenticate頭,。
然而,即使在沒(méi)有設(shè)置特殊含義的狀態(tài)代碼時(shí),,指定應(yīng)答頭也是很有用的,。應(yīng)答頭可以用來(lái)完成:設(shè)置Cookie,指定修改日期,,指示瀏覽器按照指定的間隔刷新頁(yè)面,,聲明文檔的長(zhǎng)度以便利用持久HTTP連接,……等等許多其他任務(wù),。
設(shè)置應(yīng)答頭最常用的方法是HttpServletResponse的setHeader,,該方法有兩個(gè)參數(shù),分別表示應(yīng)答頭的名字和值,。和設(shè)置狀態(tài)代碼相似,,設(shè)置應(yīng)答頭應(yīng)該在發(fā)送任何文檔內(nèi)容之前進(jìn)行。
setDateHeader方法和setIntHeadr方法專門用來(lái)設(shè)置包含日期和整數(shù)值的應(yīng)答頭,,前者避免了把Java時(shí)間轉(zhuǎn)換為GMT時(shí)間字符串的麻煩,,后者則避免了把整數(shù)轉(zhuǎn)換為字符串的麻煩。
HttpServletResponse還提供了許多設(shè)置
setContentType:設(shè)置Content-Type頭,。大多數(shù)Servlet都要用到這個(gè)方法,。 setContentLength:設(shè)置Content-Length頭。對(duì)于支持持久HTTP連接的瀏覽器來(lái)說(shuō),,這個(gè)函數(shù)是很有用的,。 addCookie:設(shè)置一個(gè)Cookie(Servlet API中沒(méi)有setCookie方法,因?yàn)閼?yīng)答往往包含多個(gè)Set-Cookie頭),。 另外,,如上節(jié)介紹,sendRedirect方法設(shè)置狀態(tài)代碼302時(shí)也會(huì)設(shè)置Location頭。
有關(guān)HTTP頭詳細(xì)和完整的說(shuō)明,,請(qǐng)參見(jiàn)http://www./Protocols/規(guī)范,。
HTTP應(yīng)答頭 說(shuō)明 Allow 服務(wù)器支持哪些請(qǐng)求方法(如GET、POST等),。
Content -Encoding 文檔的編碼(Encode)方法,。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時(shí)間,。Java的GZIPOutputStream可以很方便地進(jìn)行gzip壓縮,,但只有Unix上的Netscape和 Windows上的IE 4、IE 5才支持它,。因此,,Servlet應(yīng)該通過(guò)查看Accept-Encoding頭(即 request.getHeader("Accept-Encoding"))檢查瀏覽器是否支持gzip,為支持gzip的瀏覽器返回經(jīng)gzip壓縮的 HTML頁(yè)面,,為其他瀏覽器返回普通頁(yè)面,。
Content-Length 表示內(nèi)容長(zhǎng)度。只有當(dāng)瀏覽器使用持久HTTP連接時(shí)才需要這個(gè)數(shù)據(jù),。如果你想要利用持久連接的優(yōu)勢(shì),,可以把輸出文檔寫入ByteArrayOutputStram,完成后查看其大小,,然后把該值放入Content -Length頭,,最后通過(guò)byteArrayStream.writeTo(response.getOutputStream()發(fā)送內(nèi)容。
Content -Type 表示后面的文檔屬于什么MIME類型,。Servlet默認(rèn)為text/plain,,但通常需要顯式地指定為text/html。由于經(jīng)常要設(shè)置Content-Type,,因此HttpServletResponse提供了一個(gè)專用的方法setContentTyep,。
Date 當(dāng)前的GMT時(shí)間。你可以用setDateHeader來(lái)設(shè)置這個(gè)頭以避免轉(zhuǎn)換時(shí)間格式的麻煩,。
Expires 應(yīng)該在什么時(shí)候認(rèn)為文檔已經(jīng)過(guò)期,,從而不再緩存它?
Last -Modified 文檔的最后改動(dòng)時(shí)間,??蛻艨梢酝ㄟ^(guò)If-Modified-Since請(qǐng)求頭提供一個(gè)日期,該請(qǐng)求將被視為一個(gè)條件GET,,只有改動(dòng)時(shí)間遲于指定時(shí)間的文檔才會(huì)返回,,否則返回一個(gè)304(Not Modified)狀態(tài)。Last-Modified也可用setDateHeader方法來(lái)設(shè)置,。 Location 表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n,。Location通常不是直接設(shè)置的,,而是通過(guò)HttpServletResponse的sendRedirect方法,該方法同時(shí)設(shè)置狀態(tài)代碼為302,。
Refresh 表示瀏覽器應(yīng)該在多少時(shí)間之后刷新文檔,,以秒計(jì)。除了刷新當(dāng)前文檔之外,,你還可以通過(guò)setHeader("Refresh", "5; URL= http://host/path")讓瀏覽器讀取指定的頁(yè)面,。注意這種功能通常是通過(guò)設(shè)置HTML頁(yè)面HEAD區(qū)的<META HTTP- EQUIV="Refresh" CONTENT="5;URL=http://host/path">實(shí)現(xiàn),這是因?yàn)?,自?dòng)刷新或重定向?qū)τ谀切┎荒苁褂?/span>CGI或Servlet的HTML編寫者十分重要,。但是,對(duì)于Servlet來(lái)說(shuō),,直接設(shè)置Refresh頭更加方便,。注意Refresh的意義是"N秒之后刷新本頁(yè)面或訪問(wèn)指定頁(yè)面",,而不是"每隔N秒刷新本頁(yè)面或訪問(wèn)指定頁(yè)面",。因此,連續(xù)刷新要求每次都發(fā)送一個(gè)Refresh頭,,而發(fā)送 204狀態(tài)代碼則可以阻止瀏覽器繼續(xù)刷新,,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ... >。注意Refresh頭不屬于HTTP 1.1正式規(guī)范的一部分,,而是一個(gè)擴(kuò)展,,但Netscape和IE都支持它。
Server 服務(wù)器名字,。Servlet一般不設(shè)置這個(gè)值,,而是由Web服務(wù)器自己設(shè)置。
Set -Cookie 設(shè)置和頁(yè)面關(guān)聯(lián)的Cookie,。Servlet不應(yīng)使用response.setHeader("Set-Cookie", ...),,而是應(yīng)使用HttpServletResponse提供的專用方法addCookie,。參見(jiàn)下文有關(guān)Cookie設(shè)置的討論。
WWW-Authenticate 客戶應(yīng)該在Authorization頭中提供什么類型的授權(quán)信息,?在包含401(Unauthorized)狀態(tài)行的應(yīng)答中這個(gè)頭是必需的。例如,, response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\""),。注意 Servlet一般不進(jìn)行這方面的處理,而是讓Web服務(wù)器的專門機(jī)制來(lái)控制受密碼保護(hù)頁(yè)面的訪問(wèn)(例如.htaccess),。
HTTP請(qǐng)求模型
一,、連接至Web服務(wù)器
一個(gè)客戶端應(yīng)用(如Web瀏覽器)打開(kāi)到Web服務(wù)器的HTTP端口的一個(gè)套接字(缺省為80)。
例如:http://www.:8080/index.html 在Java中,,這將等同于代碼: Soceet socket=new Socket("www.",8080); InputStream in=socket.getInputStream(); OutputStream out=socket.getOutputStream();
二,、發(fā)送HTTP請(qǐng)求
通過(guò)連接,客戶端寫一個(gè)ASCII文本請(qǐng)求行,后跟0或多個(gè)HTTP頭標(biāo),,一個(gè)空行和實(shí)現(xiàn)請(qǐng)求的任意數(shù)據(jù),。 一個(gè)請(qǐng)求由四個(gè)部分組成:請(qǐng)求行、請(qǐng)求頭標(biāo),、空行和請(qǐng)求數(shù)據(jù)
1.請(qǐng)求行:請(qǐng)求行由三個(gè)標(biāo)記組成:請(qǐng)求方法,、請(qǐng)求URI和HTTP版本,它們用空格分隔,。 例如:GET /index.html HTTP/1.1 HTTP規(guī)范定義了8種可能的請(qǐng)求方法: GET 檢索URI中標(biāo)識(shí)資源的一個(gè)簡(jiǎn)單請(qǐng)求 HEAD 與GET方法相同,,服務(wù)器只返回狀態(tài)行和頭標(biāo),并不返回請(qǐng)求文檔 POST 服務(wù)器接受被寫入客戶端輸出流中的數(shù)據(jù)的請(qǐng)求 PUT 服務(wù)器保存請(qǐng)求數(shù)據(jù)作為指定URI新內(nèi)容的請(qǐng)求 DELETE 服務(wù)器刪除URI中命名的資源的請(qǐng)求 OPTIONS 關(guān)于服務(wù)器支持的請(qǐng)求方法信息的請(qǐng)求 TRACE Web服務(wù)器反饋Http請(qǐng)求和其頭標(biāo)的請(qǐng)求 CONNECT 已文檔化但當(dāng)前未實(shí)現(xiàn)的一個(gè)方法,,預(yù)留做隧道處理
2.請(qǐng)求頭標(biāo):由關(guān)鍵字/值對(duì)組成,,每行一對(duì),關(guān)鍵字和值用冒號(hào)(:)分隔,。 請(qǐng)求頭標(biāo)通知服務(wù)器有關(guān)于客戶端的功能和標(biāo)識(shí),,典型的請(qǐng)求頭標(biāo)有: User-Agent 客戶端廠家和版本 Accept 客戶端可識(shí)別的內(nèi)容類型列表 Content-Length 附加到請(qǐng)求的數(shù)據(jù)字節(jié)數(shù)
3.空行:最后一個(gè)請(qǐng)求頭標(biāo)之后是一個(gè)空行,發(fā)送回車符和退行,,通知服務(wù)器以下不再有頭標(biāo),。
4.請(qǐng)求數(shù)據(jù):使用POST傳送數(shù)據(jù),最常使用的是Content-Type和Content-Length頭標(biāo),。
三,、服務(wù)端接受請(qǐng)求并返回HTTP響應(yīng)
Web服務(wù)器解析請(qǐng)求,定位指定資源,。服務(wù)器將資源副本寫至套接字,,在此處由客戶端讀取。 一個(gè)響應(yīng)由四個(gè)部分組成,;狀態(tài)行,、響應(yīng)頭標(biāo)、空行,、響應(yīng)數(shù)據(jù)
1.狀態(tài)行:狀態(tài)行由三個(gè)標(biāo)記組成:HTTP版本,、響應(yīng)代碼和響應(yīng)描述。 HTTP版本:向客戶端指明其可理解的最高版本,。 響應(yīng)代碼:3位的數(shù)字代碼,,指出請(qǐng)求的成功或失敗,如果失敗則指出原因,。 響應(yīng)描述:為響應(yīng)代碼的可讀性解釋,。 例如:HTTP/1.1 200 OK
HTTP響應(yīng)碼: 1xx:信息,請(qǐng)求收到,,繼續(xù)處理 2xx:成功,,行為被成功地接受,、理解和采納 3xx:重定向,為了完成請(qǐng)求,,必須進(jìn)一步執(zhí)行的動(dòng)作 4xx:客戶端錯(cuò)誤: 2.響應(yīng)頭標(biāo):像請(qǐng)求頭標(biāo)一樣,,它們指出服務(wù)器的功能,標(biāo)識(shí)出響應(yīng)數(shù)據(jù)的細(xì)節(jié),。 3.空行:最后一個(gè)響應(yīng)頭標(biāo)之后是一個(gè)空行,,發(fā)送回車符和退行,表明服務(wù)器以下不再有頭標(biāo),。 4.響應(yīng)數(shù)據(jù):HTML文檔和圖像等,也就是HTML本身,。
四、服務(wù)器關(guān)閉連接,,瀏覽器解析響應(yīng)
1.瀏覽器首先解析狀態(tài)行,查看表明請(qǐng)求是否成功的狀態(tài)代碼,。 2.然后解析每一個(gè)響應(yīng)頭標(biāo),,頭標(biāo)告知以下為若干字節(jié)的HTML,。 3.讀取響應(yīng)數(shù)據(jù)HTML,,根據(jù)HTML的語(yǔ)法和語(yǔ)義對(duì)其進(jìn)行格式化,并在瀏覽器窗口中顯示它,。 4.一個(gè)HTML文檔可能包含其它需要被載入的資源引用,瀏覽器識(shí)別這些引用,,對(duì)其它的資源再進(jìn)行額外的請(qǐng)求,,此過(guò)程循環(huán)多次,。
五,、無(wú)狀態(tài)連接
HTTP模型是無(wú)狀態(tài)的,,表明在處理一個(gè)請(qǐng)求時(shí),,Web服務(wù)器并不記住來(lái)自同一客戶端的請(qǐng)求,。
六,、實(shí)例
1.瀏覽器發(fā)出請(qǐng)求 GET /index.html HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Content-Length: 119 Content-Type: text/html
<HTML> <HEAD> <LINK REL="stylesheet" HREF="index.css"> </HEAD> <BODY> <IMG SRC="image/logo.png"> </BODY> </HTML>
2.瀏覽器發(fā)出請(qǐng)求 GET /index.css HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 70 Content-Type: text/plane
h3{ font-size:20px; font-weight:bold; color:#005A9C; }
3.瀏覽器發(fā)出請(qǐng)求 GET image/logo.png HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 1280 Content-Type: text/plane
{Binary image data follows}
(附錄)
1.HTTP規(guī)范:Internet工程制定組織(IETF)發(fā)布的RFC指定Internet標(biāo)準(zhǔn),這些RFC被Internet研究發(fā)展機(jī)構(gòu)廣泛接受,。因?yàn)樗鼈兪菢?biāo)準(zhǔn)文檔,,故一般用正規(guī)語(yǔ)言編寫,如立法文標(biāo)一樣,。
2.RFC:RFC一旦被提出,,就被編號(hào)且不會(huì)再改變,當(dāng)一個(gè)標(biāo)準(zhǔn)被修改時(shí),,則給出一個(gè)新的RFC,。作為標(biāo)準(zhǔn),RFC在Internet上被廣泛采用,。
3.HTTP的幾個(gè)重要RFC: RFC1945 HTTP 1.0 描述 RFC2068 HTTP 1.1 初步描述 RFC2616 HTTP 1.1 標(biāo)準(zhǔn)
4.資源標(biāo)識(shí)符URI(Uniform Resource Identifter,,URI)
HTTP參考
一、HTTP碼應(yīng)碼 響應(yīng)碼由三位十進(jìn)制數(shù)字組成,,它們出現(xiàn)在由HTTP服務(wù)器發(fā)送的響應(yīng)的第一行,。
響應(yīng)碼分五種類型,由它們的第一位數(shù)字表示: 1.1xx:信息,,請(qǐng)求收到,,繼續(xù)處理 2.2xx:成功,行為被成功地接受,、理解和采納 3.3xx:重定向,,為了完成請(qǐng)求,必須進(jìn)一步執(zhí)行的動(dòng)作 4.4xx:客戶端錯(cuò)誤,,請(qǐng)求包含語(yǔ)法錯(cuò)誤或者請(qǐng)求無(wú)法實(shí)現(xiàn) 5.5xx:服務(wù)器錯(cuò)誤,,服務(wù)器不能實(shí)現(xiàn)一種明顯無(wú)效的請(qǐng)求
下表顯示每個(gè)響應(yīng)碼及其含義: 100 繼續(xù) 101 分組交換協(xié) 200 OK 201 被創(chuàng)建 202 被采納 203 非授權(quán)信息 204 無(wú)內(nèi)容 205 重置內(nèi)容 206 部分內(nèi)容 300 多選項(xiàng) 301 永久地傳送 302 找到 303 參見(jiàn)其他 304 未改動(dòng) 305 使用代理 307 暫時(shí)重定向 400 錯(cuò)誤請(qǐng)求 401 未授權(quán) 402 要求付費(fèi) 403 禁止 404 未找到 405 不允許的方法 406 不被采納 407 要求代理授權(quán) 408 請(qǐng)求超時(shí) 409 沖突 410 過(guò)期的 411 要求的長(zhǎng)度 412 前提不成立 413 請(qǐng)求實(shí)例太大 414 請(qǐng)求URI太大 415 不支持的媒體類型 416 無(wú)法滿足的請(qǐng)求范圍 417 失敗的預(yù)期 500 內(nèi)部服務(wù)器錯(cuò)誤 501 未被使用 502 網(wǎng)關(guān)錯(cuò)誤 503 不可用的服務(wù) 504 網(wǎng)關(guān)超時(shí) 505 HTTP版本未被支持
二、HTTP頭標(biāo) 頭標(biāo)由主鍵/值對(duì)組成,。它們描述客戶端或者服務(wù)器的屬性,、被傳輸?shù)馁Y源以及應(yīng)該實(shí)現(xiàn)連接。
四種不同類型的頭標(biāo): 1.通用頭標(biāo):即可用于請(qǐng)求,,也可用于響應(yīng),,是作為一個(gè)整體而不是特定資源與事務(wù)相關(guān)聯(lián)。 2.請(qǐng)求頭標(biāo):允許客戶端傳遞關(guān)于自身的信息和希望的響應(yīng)形式,。 3.響應(yīng)頭標(biāo):服務(wù)器和于傳遞自身信息的響應(yīng),。 4.實(shí)體頭標(biāo):定義被傳送資源的信息,。即可用于請(qǐng)求,也可用于響應(yīng),。
頭標(biāo)格式:<name>:<value><CRLF>
下表描述在HTTP/1.1中用到的頭標(biāo)
Accept 定義客戶端可以處理的媒體類型,,按優(yōu)先級(jí)排序;
在一個(gè)以逗號(hào)為分隔的列表中,,可以定義多種類型和使用通配符,。例如:Accept: image/jpeg,image/png,*/*
Accept-Charset定義客戶端可以處理的字符集,按優(yōu)先級(jí)排序,;
在一個(gè)以逗號(hào)為分隔的列表中,,可以定義多種類型和使用通配符。例如:Accept-Charset: iso-8859-1,*,utf-8
Accept-Encoding定義客戶端可以理解的編碼機(jī)制,。例如:Accept-Encoding:gzip,compress
Accept-Language 定義客戶端樂(lè)于接受的自然語(yǔ)言列表,。例如:Accept-Language: en,de
Accept-Ranges一個(gè)響應(yīng)頭標(biāo),它允許服務(wù)器指明:將在給定的偏移和長(zhǎng)度處,,為資源組成部分的接受請(qǐng)求,。
該頭標(biāo)的值被理解為請(qǐng)求范圍的度量單位。例如Accept-Ranges: bytes或Accept-Ranges: none
Age 允許服務(wù)器規(guī)定自服務(wù)器生成該響應(yīng)以來(lái)所經(jīng)過(guò)的時(shí)間長(zhǎng)度,,以秒為單位,。
該頭標(biāo)主要用于緩存響應(yīng)。例如:Age: 30
Allow 一個(gè)響應(yīng)頭標(biāo),,它定義一個(gè)由位于請(qǐng)求URI中的次源所支持的HTTP方法列表,。例如:Allow: GET,PUT
aUTHORIZATION 一個(gè)響應(yīng)頭標(biāo),用于定義訪問(wèn)一種資源所必需的授權(quán)(域和被編碼的用戶ID與口令),。
例如:Authorization: Basic YXV0aG9yOnBoaWw=
Cache-Control 一個(gè)用于定義緩存指令的通用頭標(biāo),。例如:Cache-Control: max-age=30
Connection 一個(gè)用于表明是否保存socket連接為開(kāi)放的通用頭標(biāo)。例如:Connection: close或Connection: keep-alive
Content-Base 一種定義基本URI的實(shí)體頭標(biāo),,為了在實(shí)體范圍內(nèi)解析相對(duì)URLs,。
如果沒(méi)有定義Content-Base頭標(biāo)解析相對(duì)URLs,使用Content-Location URI(存在且絕對(duì))或使用URI請(qǐng)求,。
例如:Content-Base: Http://www.
Content-Encoding 一種介質(zhì)類型修飾符,,標(biāo)明一個(gè)實(shí)體是如何編碼的。例如:Content-Encoding: zip
Content-Language 用于指定在輸入流中數(shù)據(jù)的自然語(yǔ)言類型,。例如:Content-Language: en
Content-Length 指定包含于請(qǐng)求或響應(yīng)中數(shù)據(jù)的字節(jié)長(zhǎng)度,。例如:Content-Length:382
Content-Location 指定包含于請(qǐng)求或響應(yīng)中的資源定位(URI)。
如果是一絕,。對(duì)URL它也作為被解析實(shí)體的相對(duì)URL的出發(fā)點(diǎn),。
例如:Content-Location: www./news
Content-MD5 實(shí)體的一種MD5摘要,用作校驗(yàn)和,。
發(fā)送方和接受方都計(jì)算MD5摘要,,接受方將其計(jì)算的值與此頭標(biāo)中傳遞的值進(jìn)行比較,。
例如:Content-MD5:
Content-Range 隨部分實(shí)體一同發(fā)送;標(biāo)明被插入字節(jié)的低位與高位字節(jié)偏移,,也標(biāo)明此實(shí)體的總長(zhǎng)度,。
例如:Content-Range: 1001-2000/5000
Contern-Type標(biāo)明發(fā)送或者接收的實(shí)體的MIME類型。例如:Content-Type: text/html
Date 發(fā)送HTTP消息的日期,。例如:Date: Mon,10PR 18:42:51 GMT
ETag 一種實(shí)體頭標(biāo),,它向被發(fā)送的資源分派一個(gè)唯一的標(biāo)識(shí)符。
對(duì)于可以使用多種URL請(qǐng)求的資源,,ETag可以用于確定實(shí)際被發(fā)送的資源是否為同一資源。
例如:ETag: "208f-419e-30f8dc99"
Expires 指定實(shí)體的有效期,。例如:Expires: Mon,05 Dec 2008 12:00:00 GMT
Form 一種請(qǐng)求頭標(biāo),,給定控制用戶代理的人工用戶的電子郵件地址。例如:From: webmaster@
Host 被請(qǐng)求資源的主機(jī)名,。對(duì)于使用HTTP/1.1的請(qǐng)求而言,,此域是強(qiáng)制性的。例如:Host: www.
If-Modified-Since 如果包含了GET請(qǐng)求,,導(dǎo)致該請(qǐng)求條件性地依賴于資源上次修改日期,。
如果出現(xiàn)了此頭標(biāo),并且自指定日期以來(lái),,此資源已被修改,,應(yīng)該反回一個(gè)304響應(yīng)代碼。
例如:If-Modified-Since: Mon,10PR 18:42:51 GMT
If-Match 如果包含于一個(gè)請(qǐng)求,,指定一個(gè)或者多個(gè)實(shí)體標(biāo)記,。只發(fā)送其ETag與列表中標(biāo)記區(qū)配的資源。
例如:If-Match: "208f-419e-308dc99"
If-None-Match 如果包含一個(gè)請(qǐng)求,,指定一個(gè)或者多個(gè)實(shí)體標(biāo)記,。資源的ETag不與列表中的任何一個(gè)條件匹配,操作才執(zhí)行,。
例如:If-None-Match: "208f-419e-308dc99"
If-Range 指定資源的一個(gè)實(shí)體標(biāo)記,,客戶端已經(jīng)擁有此資源的一個(gè)拷貝。必須與Range頭標(biāo)一同使用,。
如果此實(shí)體自上次被客戶端檢索以來(lái),,還不曾修改過(guò),那么服務(wù)器只發(fā)送指定的范圍,,否則它將發(fā)送整個(gè)資源,。
例如:Range: byte=0-499If-Range:"208f-419e-30f8dc99"
If-Unmodified-Since 只有自指定的日期以來(lái),被請(qǐng)求的實(shí)體還不曾被修改過(guò),,才會(huì)返回此實(shí)體,。
例如:If-Unmodified-Since:Mon,10PR 18:42:51 GMT
Last-Modified 指定被請(qǐng)求資源上次被修改的日期和時(shí)間,。例如:Last-Modified: Mon,10PR 18:42:51 GMT
Location 對(duì)于一個(gè)已經(jīng)移動(dòng)的資源,用于重定向請(qǐng)求者至另一個(gè)位置,。
與狀態(tài)編碼302(暫時(shí)移動(dòng))或者301(永久性移動(dòng))配合使用,。
例如:Location: www2./index.jsp
Max-Forwards 一個(gè)用于TRACE方法的請(qǐng)求頭標(biāo),以指定代理或網(wǎng)關(guān)的最大數(shù)目,,該請(qǐng)求通過(guò)網(wǎng)關(guān)才得以路由,。
在通過(guò)請(qǐng)求傳遞之前,代理或網(wǎng)關(guān)應(yīng)該減少此數(shù)目,。例如:Max-Forwards: 3
Pragma 一個(gè)通用頭標(biāo),,它發(fā)送實(shí)現(xiàn)相關(guān)的信息。例如:Pragma: no-cache
Proxy-Authenticate 類似于WWW-Authenticate,,便是有意請(qǐng)求只來(lái)自請(qǐng)求鏈(代理)的下一個(gè)服務(wù)器的認(rèn)證,。
例如:Proxy-Authenticate: Basic realm-admin
Proxy-Proxy-Authorization 類似于授權(quán),但并非有意傳遞任何比在即時(shí)服務(wù)器鏈中更進(jìn)一步的內(nèi)容,。
例如:Proxy-Proxy-Authorization: Basic YXV0aG9yOnBoaWw=
Public 列表顯示服務(wù)器所支持的方法集,。例如:Public: OPTIONS,MGET,MHEAD,GET,HEAD
Range 指定一種度量單位和一個(gè)部分被請(qǐng)求資源的偏移范圍。例如:Range: bytes=206-5513
Refener 一種請(qǐng)求頭標(biāo)域,,標(biāo)明產(chǎn)生請(qǐng)求的初始資源,。對(duì)于HTML表單,它包含此表單的Web頁(yè)面的地址,。
例如:Refener: www./news/search.html
Retry-After 一種響應(yīng)頭標(biāo)域,,由服務(wù)器與狀態(tài)編碼503(無(wú)法提供服務(wù))配合發(fā)送,以標(biāo)明再次請(qǐng)求之前應(yīng)該等待多長(zhǎng)時(shí)間,。
此時(shí)間即可以是一種日期,,也可以是一種秒單位。例如:Retry-After: 18
Server 一種標(biāo)明Web服務(wù)器軟件及其版本號(hào)的頭標(biāo),。例如:Server: Apache/2.0.46(Win32)
Transfer-Encoding 一種通用頭標(biāo),,標(biāo)明對(duì)應(yīng)被接受方反向的消息體實(shí)施變換的類型。例如:Transfer-Encoding: chunked
Upgrade 允許服務(wù)器指定一種新的協(xié)議或者新的協(xié)議版本,,與響應(yīng)編碼101(切換協(xié)議)配合使用,。
例如:Upgrade: HTTP/2.0
User-Agent定義用于產(chǎn)生請(qǐng)求的軟件類型(典型的如Web瀏覽器)。
例如:User-Agent: Mozilla/4.0(compatible; MSIE 5.5; Windows NT; DigExt)
Vary 一個(gè)響應(yīng)頭標(biāo),,用于表示使用服務(wù)器驅(qū)動(dòng)的協(xié)商從可用的響應(yīng)表示中選擇響應(yīng)實(shí)體,。例如:Vary: *
Via 一個(gè)包含所有中間主機(jī)和協(xié)議的通用頭標(biāo),用于滿足請(qǐng)求,。例如:Via: 1.0 fred.com, 1.1 wilma.com
Warning 用于提供關(guān)于響應(yīng)狀態(tài)補(bǔ)充信息的響應(yīng)頭標(biāo),。例如:Warning: 99 www. Piano needs tuning
www-Authenticate 一個(gè)提示用戶代理提供用戶名和口令的響應(yīng)頭標(biāo),與狀態(tài)編碼401(未授權(quán))配合使用,。響應(yīng)一個(gè)授權(quán)頭標(biāo),。
例如:www-Authenticate: Basic realm=zxm.mgmt
<!--EndFragment-->
|