通常HTTP消息包括客戶機(jī)向服務(wù)器的請求消息和服務(wù)器向客戶機(jī)的響應(yīng)消息平绩。這兩種類型的消息由一個起始行文兢,一個或者多個頭域,一個只是頭域結(jié)束的空行和可 選的消息體組成餐弱。HTTP的頭域包括通用頭宴霸,請求頭,響應(yīng)頭和實體頭四個部分膏蚓。每個頭域由一個域名瓢谢,冒號(:)和域值三部分組成。域名是大小寫無關(guān)的驮瞧,域 值前可以添加任何數(shù)量的空格符氓扛,頭域可以被擴(kuò)展為多行,在每行開始處,使用至少一個空格或制表符采郎。
通用頭域 (通用首部)
通用頭域包含請求和響應(yīng)消息都支持的頭域千所,提供了與報文相關(guān)的最基本的信息,通用頭域包含
Connection 允許客戶端和服務(wù)器指定與請求/響應(yīng)連接有關(guān)的選項
Date 提供日期和時間標(biāo)志,說明報文是什么時間創(chuàng)建的
MIME-Version 給出發(fā)送端使用的MIME版本
Trailer 如果報文采用了分塊傳輸編碼(chunked transfer encoding) 方式,就可以用這個首部列出位于報文拖掛(trailer)部分的首部集合
Transfer-Encoding 告知接收端為了保證報文的可靠傳輸,對報文采用了什么編碼方式
Upgrade 給出了發(fā)送端可能想要"升級"使用的新版本和協(xié)議
Via 顯示了報文經(jīng)過的中間節(jié)點(代理,網(wǎng)嘎un)
對通用頭域的擴(kuò)展要求通訊雙方都支持此擴(kuò) 展,如果存在不支持的通用頭域蒜埋,一般將會作為實體頭域處理淫痰。下面簡單介紹幾個在UPnP消息中使用的通用頭域。
Cache-Control頭域
Cache -Control指定請求和響應(yīng)遵循的緩存機(jī)制整份。在請求消息或響應(yīng)消息中設(shè)置 Cache-Control并不會修改另一個消息處理過程中的緩存處理過程待错。請求時的緩存指令包括no-cache、no-store烈评、max-age朗鸠、 max-stale、min-fresh础倍、only-if-cached烛占,響應(yīng)消息中的指令包括public、private沟启、no-cache忆家、no- store、no-transform德迹、must-revalidate芽卿、proxy-revalidate、max-age胳搞。各個消息中的指令含義如 下:
Public指示響應(yīng)可被任何緩存區(qū)緩存卸例。
Private指示對于單個用戶的整個或部分響應(yīng)消息,不能被共享緩存處理肌毅。這允許服務(wù)器僅僅描述當(dāng)用戶的部分響應(yīng)消息筷转,此響應(yīng)消息對于其他用戶的請求無效。
no-cache指示請求或響應(yīng)消息不能緩存
no-store用于防止重要的信息被無意的發(fā)布悬而。在請求消息中發(fā)送將使得請求和響應(yīng)消息都不使用緩存呜舒。
max-age指示客戶機(jī)可以接收生存期不大于指定時間(以秒為單位)的響應(yīng)。
min-fresh指示客戶機(jī)可以接收響應(yīng)時間小于當(dāng)前時間加上指定時間的響應(yīng)笨奠。
max-stale指示客戶機(jī)可以接收超出超時期間的響應(yīng)消息袭蝗。如果指定max-stale消息的值,那么客戶機(jī)可以接收超出超時期指定值之內(nèi)的響應(yīng)消息般婆。
Date頭域
Date頭域表示消息發(fā)送的時間到腥,時間的描述格式由rfc822定義。例如蔚袍,Date:Mon,31Dec200104:25:57GMT乡范。Date描述的時間表示世界標(biāo)準(zhǔn)時,換算成本地時間,需要知道用戶所在的時區(qū)篓足。
Pragma頭域
Pragma頭域用來包含實現(xiàn)特定的指令,最常用的是Pragma:no-cache闰蚕。在HTTP/1.1協(xié)議中栈拖,它的含義和Cache- Control:no-cache相同。
請求消息
請求消息的第一行為下面的格式:
MethodSPRequest-URISPHTTP-VersionCRLFMethod 表示對于Request-URI完成的方法没陡,這個字段是大小寫敏感的涩哟,包括OPTIONS、GET盼玄、HEAD贴彼、POST、PUT埃儿、DELETE器仗、 TRACE。方法GET和HEAD應(yīng)該被所有的通用WEB服務(wù)器支持童番,其他所有方法的實現(xiàn)是可選的精钮。GET方法取回由Request-URI標(biāo)識的信息。 HEAD方法也是取回由Request-URI標(biāo)識的信息剃斧,只是可以在響應(yīng)時轨香,不返回消息體。POST方法可以請求服務(wù)器接收包含在請求中的實體信息幼东,可 以用于提交表單臂容,向新聞組、BBS根蟹、郵件群組和數(shù)據(jù)庫發(fā)送消息脓杉。
SP表示空格。Request-URI遵循URI格式简逮,在此字段為星 號(*)時丽已,說明請求并不用于某個特定的資源地址,而是用于服務(wù)器本身买决。HTTP- Version表示支持的HTTP版本沛婴,例如為HTTP/1.1。CRLF表示換行回車符督赤。請求頭域允許客戶端向服務(wù)器傳遞關(guān)于請求或者關(guān)于客戶機(jī)的附加 信息嘁灯。請求頭域可能包含下列字段Accept、Accept-Charset躲舌、Accept- Encoding丑婿、Accept-Language、Authorization、From羹奉、Host秒旋、If-Modified-Since、If- Match诀拭、If-None-Match迁筛、If-Range、If-Range耕挨、If-Unmodified-Since细卧、Max-Forwards、 Proxy-Authorization筒占、Range贪庙、Referer、User-Agent翰苫。對請求頭域的擴(kuò)展要求通訊雙方都支持止邮,如果存在不支持的請 求頭域,一般將會作為實體頭域處理奏窑。
典型的請求消息:
GET http://download.google.com/somedata.exe
Host: download.google.com
Accept:*/*
Pragma: no-cache
Cache-Control: no-cache
Referer: http://download.google.com/
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-
上例第一行表示HTTP客戶端(可能是瀏覽器农尖、下載程序)通過GET方法獲得指定URL下的文件。棕色的部分表示請求頭域的信息良哲,綠色的部分表示通用頭部分盛卡。
Host頭域
Host頭域指定請求資源的Intenet主機(jī)和端口號,必須表示請求url的原始服務(wù)器或網(wǎng)關(guān)的位置筑凫。HTTP/1.1請求必須包含主機(jī)頭域滑沧,否則系統(tǒng)會以400狀態(tài)碼返回。
Referer頭域
Referer 頭域允許客戶端指定請求uri的源資源地址巍实,這可以允許服務(wù)器生成回退鏈表滓技,可用來登陸、優(yōu)化cache等棚潦。他也允許廢除的或錯誤的連接由于維護(hù)的目的被 追蹤令漂。如果請求的uri沒有自己的uri地址,Referer不能被發(fā)送丸边。如果指定的是部分uri地址叠必,則此地址應(yīng)該是一個相對地址。
Range頭域
Range頭域可以請求實體的一個或者多個子范圍妹窖。例如纬朝,
表示頭500個字節(jié):bytes=0-499
表示第二個500字節(jié):bytes=500-999
表示最后500個字節(jié):bytes=-500
表示500字節(jié)以后的范圍:bytes=500-
第一個和最后一個字節(jié):bytes=0-0,-1
同時指定幾個范圍:bytes=500-600,601-999
但是服務(wù)器可以忽略此請求頭,如果無條件GET包含Range請求頭骄呼,響應(yīng)會以狀態(tài)碼206(PartialContent)返回而不是以200 (OK)共苛。
User-Agent頭域
User-Agent頭域的內(nèi)容包含發(fā)出請求的用戶信息判没。
響應(yīng)消息
響應(yīng)消息的第一行為下面的格式:
HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF
HTTP -Version表示支持的HTTP版本,例如為HTTP/1.1隅茎。Status- Code是一個三個數(shù)字的結(jié)果代碼澄峰。Reason-Phrase給Status-Code提供一個簡單的文本描述。Status-Code主要用于機(jī)器自 動識別辟犀,Reason-Phrase主要用于幫助用戶理解俏竞。Status-Code的第一個數(shù)字定義響應(yīng)的類別,后兩個數(shù)字沒有分類的作用踪蹬。第一個數(shù)字可 能取5個不同的值:
1xx:信息響應(yīng)類,表示接收到請求并且繼續(xù)處理
2xx:處理成功響應(yīng)類臣咖,表示動作被成功接收跃捣、理解和接受
3xx:重定向響應(yīng)類,為了完成指定的動作夺蛇,必須接受進(jìn)一步處理
4xx:客戶端錯誤疚漆,客戶請求包含語法錯誤或者是不能正確執(zhí)行
5xx:服務(wù)端錯誤,服務(wù)器不能正確執(zhí)行一個正確的請求
響應(yīng)頭域允許服務(wù)器傳遞不能放在狀態(tài)行的附加信息刁赦,這些域主要描述服務(wù)器的信息和 Request-URI進(jìn)一步的信息娶聘。響應(yīng)頭域包含Age、Location甚脉、Proxy-Authenticate丸升、Public、Retry- After牺氨、Server狡耻、Vary简烤、Warning界轩、WWW-Authenticate。對響應(yīng)頭域的擴(kuò)展要求通訊雙方都支持茬贵,如果存在不支持的響應(yīng)頭 域郊霎,一般將會作為實體頭域處理沼头。
典型的響應(yīng)消息:
HTTP/1.0200OK
Date:Mon,31Dec200104:25:57GMT
Server:Apache/1.3.14(Unix)
Content-type:text/html
Last-modified:Tue,17Apr200106:46:28GMT
Etag:"a030f020ac7c01:1e9f"
Content-length:39725426
Content-range:bytes554554-40279979/40279980
上例第一行表示HTTP服務(wù)端響應(yīng)一個GET方法。棕色的部分表示響應(yīng)頭域的信息书劝,綠色的部分表示通用頭部分进倍,紅色的部分表示實體頭域的信息。
Location響應(yīng)頭
Location響應(yīng)頭用于重定向接收者到一個新URI地址购对。
Server響應(yīng)頭
Server響應(yīng)頭包含處理請求的原始服務(wù)器的軟件信息背捌。此域能包含多個產(chǎn)品標(biāo)識和注釋,產(chǎn)品標(biāo)識一般按照重要性排序洞斯。
實體
請求消息和響應(yīng)消息都可以包含實體信息毡庆,實體信息一般由實體頭域和實體組成坑赡。實體頭域包含關(guān)于實體的原信息,實體頭包括Allow么抗、Content- Base毅否、Content-Encoding、Content-Language蝇刀、 Content-Length螟加、Content-Location、Content-MD5吞琐、Content-Range捆探、Content-Type、 Etag站粟、Expires黍图、Last-Modified、extension-header奴烙。extension-header允許客戶端定義新的實體 頭助被,但是這些域可能無法未接受方識別。實體可以是一個經(jīng)過編碼的字節(jié)流切诀,它的編碼方式由Content-Encoding或Content-Type定 義揩环,它的長度由Content-Length或Content-Range定義。
Content-Type實體頭
Content-Type實體頭用于向接收方指示實體的介質(zhì)類型幅虑,指定HEAD方法送到接收方的實體介質(zhì)類型丰滑,或GET方法發(fā)送的請求介質(zhì)類型 Content-Range實體頭
Content-Range實體頭用于指定整個實體中的一部分的插入位置,他也指示了整個實體的長度倒庵。在服務(wù)器向客戶返回一個部分響應(yīng)吨枉,它必須描述響應(yīng)覆蓋的范圍和整個實體長度。一般格式:
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
例如哄芜,傳送頭500個字節(jié)次字段的形式:Content-Range:bytes0- 499/1234如果一個http消息包含此節(jié)(例如貌亭,對范圍請求的響應(yīng)或?qū)σ幌盗蟹秶闹丿B請求),Content-Range表示傳送的范圍认臊, Content-Length表示實際傳送的字節(jié)數(shù)圃庭。
Last-modified實體頭
應(yīng)答頭 說明
Allow 服務(wù)器支持哪些請求方法(如GET、POST等)失晴。
Content-Encoding 文 檔的編碼(Encode)方法剧腻。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的 下載時間涂屁。Java的GZIPOutputStream可以很方便地進(jìn)行g(shù)zip壓縮书在,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它拆又。因此儒旬,Servlet應(yīng)該通過查看Accept-Encoding頭(即request.getHeader("Accept- Encoding"))檢查瀏覽器是否支持gzip栏账,為支持gzip的瀏覽器返回經(jīng)gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面栈源。
Content-Length 表 示內(nèi)容長度挡爵。只有當(dāng)瀏覽器使用持久HTTP連接時才需要這個數(shù)據(jù)。如果你想要利用持久連接的優(yōu)勢甚垦,可以把輸出文檔寫入 ByteArrayOutputStram茶鹃,完成后查看其大小,然后把該值放入Content-Length頭艰亮,最后通過 byteArrayStream.writeTo(response.getOutputStream()發(fā)送內(nèi)容闭翩。
Content-Type 表示后面的文檔屬于什么MIME類型。Servlet默認(rèn)為text/plain迄埃,但通常需要顯式地指定為text/html疗韵。由于經(jīng)常要設(shè)置Content-Type,因此HttpServletResponse提供了一個專用的方法setContentTyep调俘。
Date 當(dāng)前的GMT時間伶棒。你可以用setDateHeader來設(shè)置這個頭以避免轉(zhuǎn)換時間格式的麻煩旺垒。
Expires 應(yīng)該在什么時候認(rèn)為文檔已經(jīng)過期彩库,從而不再緩存它?
Last-Modified 文 檔的最后改動時間先蒋『眨客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET竞漾,只有改動時間遲于指定時間的文檔 才會返回眯搭,否則返回一個304(Not Modified)狀態(tài)。Last-Modified也可用setDateHeader方法來設(shè)置业岁。
Location 表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n鳞仙。Location通常不是直接設(shè)置的,而是通過HttpServletResponse的sendRedirect方法笔时,該方法同時設(shè)置狀態(tài)代碼為302棍好。
Refresh 表示瀏覽器應(yīng)該在多少時間之后刷新文檔,以秒計允耿。除了刷新當(dāng)前文檔之外借笙,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。
注 意這種功能通常是通過設(shè)置HTML頁面HEAD區(qū)的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實現(xiàn)较锡,這是因為业稼,自動刷新或重定向?qū)τ谀切┎荒苁褂肅GI或Servlet的 HTML編寫者十分重要。但是蚂蕴,對于Servlet來說低散,直接設(shè)置Refresh頭更加方便俯邓。
注意Refresh的意義是“N秒之后 刷新本頁面或訪問指定頁面”,而不是“每隔N秒刷新本頁面或訪問指定頁面”谦纱。因此看成,連續(xù)刷新要求每次都發(fā)送一個Refresh頭,而發(fā)送204狀態(tài)代碼則 可以阻止瀏覽器繼續(xù)刷新跨嘉,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>川慌。
注意Refresh頭不屬于HTTP 1.1正式規(guī)范的一部分,而是一個擴(kuò)展祠乃,但Netscape和IE都支持它梦重。
Server 服務(wù)器名字。Servlet一般不設(shè)置這個值亮瓷,而是由Web服務(wù)器自己設(shè)置琴拧。
Set-Cookie 設(shè)置和頁面關(guān)聯(lián)的Cookie。Servlet不應(yīng)使用response.setHeader("Set-Cookie", ...)嘱支,而是應(yīng)使用HttpServletResponse提供的專用方法addCookie蚓胸。參見下文有關(guān)Cookie設(shè)置的討論。
WWW-Authenticate 客 戶應(yīng)該在Authorization頭中提供什么類型的授權(quán)信息除师?在包含401(Unauthorized)狀態(tài)行的應(yīng)答中這個頭是必需的沛膳。例如, response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")汛聚。
注意Servlet一般不進(jìn)行這方面的處理锹安,而是讓W(xué)eb服務(wù)器的專門機(jī)制來控制受密碼保護(hù)頁面的訪問(例如.htaccess)。