網(wǎng)絡(luò)?-HTTP

HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。。
HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。

Http工作原理
HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)上。瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請求。
Web服務(wù)器有:Apache服務(wù)器,IIS服務(wù)器(Internet Information Services)等。
Web服務(wù)器根據(jù)接收到的請求后,向客戶端發(fā)送響應(yīng)信息。
HTTP默認(rèn)端口號為80,但是你也可以改為8080或者其他端口。

HTTP三點(diǎn)注意事項(xiàng):
? HTTP是無連接:無連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
? HTTP是媒體獨(dú)立的:這意味著,只要客戶端和服務(wù)器知道如何處理的數(shù)據(jù)內(nèi)容,任何類型的數(shù)據(jù)都可以通過HTTP發(fā)送??蛻舳艘约胺?wù)器指定使用適合的MIME-type內(nèi)容類型。(詳見下面介紹:HTTP content-Type )
? HTTP是無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。

在這里插入圖片描述

CGI(Common Gateway Interface) 是 HTTP
服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行“交談”的一種工具,其程序須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上。 絕大多數(shù)的 CGI
程序被用來解釋處理來自表單的輸入信息,并在服務(wù)器產(chǎn)生相應(yīng)的處理,或?qū)⑾鄳?yīng)的信息反饋給瀏覽器。CGI 程序使網(wǎng)頁具有交互功能。

瀏覽器顯示的內(nèi)容都有 HTML、XML、GIF、Flash 等,瀏覽器是通過 MIME Type 區(qū)分它們,決定用什么內(nèi)容什么形式來顯示。
注釋:MIME Type 是該資源的媒體類型,MIME Type 不是個(gè)人指定的,是經(jīng)過互聯(lián)網(wǎng)(IETF)組織協(xié)商,以
RFC(是一系列以編號排定的文件,幾乎所有的互聯(lián)網(wǎng)標(biāo)準(zhǔn)都有收錄在其中) 的形式作為建議的標(biāo)準(zhǔn)發(fā)布在網(wǎng)上的,大多數(shù)的 Web
服務(wù)器和用戶代理都會(huì)支持這個(gè)規(guī)范 (順便說一句,Email 附件的類型也是通過 MIME Type 指定的)。 媒體類型通常通過 HTTP
協(xié)議,由 Web 服務(wù)器告知瀏覽器的,更準(zhǔn)確地說,是通過 Content-Type
來表示的。例如:Content-Type:text/HTML。 通常只有一些卓哉互聯(lián)網(wǎng)上獲得廣泛應(yīng)用的格式才會(huì)獲得一個(gè) MIME
Type,如果是某個(gè)客戶端自己定義的格式,一般只能以 application/x- 開頭。

HTTP 消息結(jié)構(gòu)

HTTP是基于客戶端/服務(wù)端(C/S)的架構(gòu)模型,通過一個(gè)可靠的鏈接來交換信息,是一個(gè)無狀態(tài)的請求/響應(yīng)協(xié)議。

一個(gè)HTTP"客戶端"是一個(gè)應(yīng)用程序(Web瀏覽器或其他任何客戶端),通過連接到服務(wù)器達(dá)到向服務(wù)器發(fā)送一個(gè)或多個(gè)HTTP的請求的目的。

一個(gè)HTTP"服務(wù)器"同樣也是一個(gè)應(yīng)用程序(通常是一個(gè)Web服務(wù),如Apache Web服務(wù)器或IIS服務(wù)器等),通過接收客戶端的請求并向客戶端發(fā)送HTTP響應(yīng)數(shù)據(jù)。

HTTP使用統(tǒng)一資源標(biāo)識符(Uniform Resource Identifiers, URI)來傳輸數(shù)據(jù)和建立連接。

一旦建立連接后,數(shù)據(jù)消息就通過類似Internet郵件所使用的格式[RFC5322]和多用途Internet郵件擴(kuò)展(MIME)[RFC2045]來傳送。

客戶端請求消息

一個(gè)HTTP請求報(bào)文由請求行(request line)、請求頭(header)、空行和請求數(shù)據(jù)4個(gè)部分組成,下圖給出了請求報(bào)文的一般格式。

請求報(bào)文

請求行

請求行由請求方法字段、URL字段和HTTP協(xié)議版本字段3個(gè)字段組成,它們用空格分隔。例如,GET /index.html HTTP/1.1。

根據(jù)HTTP標(biāo)準(zhǔn),HTTP請求可以使用多種請求方法。
? HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
? HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

HTTP 協(xié)議的 8 種請求類型介紹
HTTP 協(xié)議中共定義了八種方法或者叫“動(dòng)作”來表明對 Request-URI 指定的資源的不同操作方式,具體介紹如下:

  • OPTIONS:返回服務(wù)器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請求來測試服務(wù)器的功能性。
  • HEAD:向服務(wù)器索要與GET請求相一致的響應(yīng),只不過響應(yīng)體將不會(huì)被返回。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。
  • GET:向特定的資源發(fā)出請求。
  • POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST請求可能會(huì)導(dǎo)致新的資源的創(chuàng)建和/或已有資源的修改。
  • PUT:向指定資源位置上傳其最新內(nèi)容。
  • DELETE:請求服務(wù)器刪除 Request-URI 所標(biāo)識的資源。
  • TRACE:回顯服務(wù)器收到的請求,主要用于測試或診斷。
  • CONNECT:HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
    雖然 HTTP 的請求方式有 8 種,但是我們在實(shí)際應(yīng)用中常用的也就是 get 和 post,其他請求方式也都可以通過這兩種方式間接的來實(shí)現(xiàn)。

1).GET
最常見的一種請求方式,當(dāng)客戶端要從服務(wù)器中讀取文檔時(shí),當(dāng)點(diǎn)擊網(wǎng)頁上的鏈接或者通過在瀏覽器的地址欄輸入網(wǎng)址來瀏覽網(wǎng)頁的,使用的都是GET方式。GET方法要求服務(wù)器將URL定位的資源放在響應(yīng)報(bào)文的數(shù)據(jù)部分,回送給客戶端。使用GET方法時(shí),請求參數(shù)和對應(yīng)的值附加在URL后面,利用一個(gè)問號(“?”)代表URL的結(jié)尾與請求參數(shù)的開始,傳遞參數(shù)長度受限制。例如,/index.jsp?id=100&op=bind,這樣通過GET方式傳遞的數(shù)據(jù)直接表示在地址中,所以我們可以把請求結(jié)果以鏈接的形式發(fā)送給好友。以用google搜索domety為例,Request格式如下:

GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1    
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, application/x-shockwave-flash, */*    
Referer: <a >http://www.google.cn/</a>
Accept-Language: zh-cn    
Accept-Encoding: gzip, deflate    
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)    
Host: <a >www.google.cn</a>    
Connection: Keep-Alive    
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r   

可以看到,GET方式的請求一般不包含”請求內(nèi)容”部分,請求數(shù)據(jù)以地址的形式表現(xiàn)在請求行。地址鏈接如下:

<a >http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=</a>  

地址中”?”之后的部分就是通過GET發(fā)送的請求數(shù)據(jù),我們可以在地址欄中清楚的看到,各個(gè)數(shù)據(jù)之間用”&”符號隔開。顯然,這種方式不適合傳送私密數(shù)據(jù)。另外,由于不同的瀏覽器對地址的字符限制也有所不同,一般最多只能識別1024個(gè)字符,所以如果需要傳送大量數(shù)據(jù)的時(shí)候,也不適合使用GET方式。

2).POST
對于上面提到的不適合使用GET方式的情況,可以考慮使用POST方式,因?yàn)槭褂肞OST方法可以允許客戶端給服務(wù)器提供信息較多。POST方法將請求參數(shù)封裝在HTTP請求數(shù)據(jù)中,以名稱/值的形式出現(xiàn),可以傳輸大量數(shù)據(jù),這樣POST方式對傳送的數(shù)據(jù)大小沒有限制,而且也不會(huì)顯示在URL中。還以上面的搜索domety為例,如果使用POST方式的話,格式如下:

POST /search HTTP/1.1    
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, application/x-shockwave-flash, */*    
Referer: <a >http://www.google.cn/</a>    
Accept-Language: zh-cn    
Accept-Encoding: gzip, deflate    
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)    
Host: <a >www.google.cn</a>    
Connection: Keep-Alive    
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_rhl=zh-CN&source=hp&q=domety  

可以看到,POST方式請求行中不包含數(shù)據(jù)字符串,這些數(shù)據(jù)保存在”請求內(nèi)容”部分,各數(shù)據(jù)之間也是使用”&”符號隔開。POST方式大多用于頁面的表單中。因?yàn)镻OST也能完成GET的功能,因此多數(shù)人在設(shè)計(jì)表單的時(shí)候一律都使用POST方式,其實(shí)這是一個(gè)誤區(qū)。GET方式也有自己的特點(diǎn)和優(yōu)勢,我們應(yīng)該根據(jù)不同的情況來選擇是使用GET還是使用POST。

3).HEAD
HEAD就像GET,只不過服務(wù)端接受到HEAD請求后只返回響應(yīng)頭,而不會(huì)發(fā)送響應(yīng)內(nèi)容。當(dāng)我們只需要查看某個(gè)頁面的狀態(tài)的時(shí)候,使用HEAD是非常高效的,因?yàn)樵趥鬏數(shù)倪^程中省去了頁面內(nèi)容。

請求頭

請求頭部由關(guān)鍵字/值對組成,每行一對,關(guān)鍵字和值用英文冒號“:”分隔。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息,典型的請求頭有:
? User-Agent:產(chǎn)生請求的瀏覽器類型。
? Accept:客戶端可識別的內(nèi)容類型列表。
? Host:請求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP地址,即虛擬主機(jī)。

空行

最后一個(gè)請求頭之后是一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請求頭。

請求數(shù)據(jù)

請求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用。POST方法適用于需要客戶填寫表單的場合。與請求數(shù)據(jù)相關(guān)的最常使用的請求頭是Content-Type和Content-Length。

示例
1).GET

//請求首行
GET /hello/index.jsp HTTP/1.1
//請求頭信息,因?yàn)镚ET請求沒有正文
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98
//空行
//因?yàn)镚ET沒有正文,所以下面為空

2).POST

// 請求首行
POST /hello/index.jsp HTTP/1.1
//請求頭信息
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://localhost/hello/index.jsp
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98
Content-Type: application/x-www-form-urlencoded 
Content-Length: 14 
// 這里是空行
//POST有請求正文
username=hello

服務(wù)器響應(yīng)消息

HTTP響應(yīng)由三個(gè)部分組成,分別是:狀態(tài)行、響應(yīng)頭、空行、響應(yīng)正文。

正如你所見,在響應(yīng)中唯一真正的區(qū)別在于第一行中用狀態(tài)信息代替了請求信息。狀態(tài)行(status line)通過提供一個(gè)狀態(tài)碼來說明所請求的資源情況。

狀態(tài)行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服務(wù)器HTTP協(xié)議的版本;
Status-Code表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼;
Reason-Phrase表示狀態(tài)代碼的文本描述。

在這里插入圖片描述

HTTP狀態(tài)碼

當(dāng)瀏覽者訪問一個(gè)網(wǎng)頁時(shí),瀏覽者的瀏覽器會(huì)向網(wǎng)頁所在服務(wù)器發(fā)出請求。當(dāng)瀏覽器接收并顯示網(wǎng)頁前,此網(wǎng)頁所在的服務(wù)器會(huì)返回一個(gè)包含HTTP狀態(tài)碼的信息頭(server header)用以響應(yīng)瀏覽器的請求。

HTTP狀態(tài)碼的英文為HTTP Status Code。狀態(tài)代碼由三個(gè)十進(jìn)制數(shù)字組成,第一個(gè)十進(jìn)制數(shù)字定義了狀態(tài)碼的類型,后兩個(gè)數(shù)字沒有分類的作用,且有五種可能取值。

? 1xx:指示信息--表示請求已接收,繼續(xù)處理。
? 2xx:成功--表示請求已被成功接收、理解、接受。
? 3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作。
? 4xx:客戶端錯(cuò)誤--請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)。
? 5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請求。

常見狀態(tài)代碼、狀態(tài)描述的說明如下

? 200 OK:客戶端請求成功。
? 400 Bad Request:客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解。
? 401 Unauthorized:請求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用。
? 403Forbidden:服務(wù)器收到請求,但是拒絕提供服務(wù)。
? 404 Not Found:請求資源不存在,舉個(gè)例子:輸入了錯(cuò)誤的URL。
? 500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤。
? 503 ServerUnavailable:服務(wù)器當(dāng)前不能處理客戶端的請求,一段時(shí)間后可能恢復(fù)正常,舉個(gè)例子:HTTP/1.1 200 OK(CRLF)。

HTTP狀態(tài)碼列表:

狀態(tài)碼 狀態(tài)碼英文名稱 中文描述
100 Continue 繼續(xù),客戶端應(yīng)繼續(xù)其請求
101 Switching Protocols 切換協(xié)議。服務(wù)器根據(jù)客戶端的請求切換協(xié)議。只能切換到更高級的協(xié)議,例如,切換到HTTP的新版本協(xié)議
200 OK 請求成功。一般用于GET與POST請求
201 Created 已創(chuàng)建。成功請求并創(chuàng)建了新的資源
202 Accepted 已接受。已經(jīng)接受請求,但未處理完成
203 Non-Authoritative Information 非授權(quán)信息。請求成功。但返回的meta信息不在原始的服務(wù)器,而是一個(gè)副本
204 No Content 無內(nèi)容。服務(wù)器成功處理,但未返回內(nèi)容。在未更新網(wǎng)頁的情況下,可確保瀏覽器繼續(xù)顯示當(dāng)前文檔
205 Reset Content 重置內(nèi)容。服務(wù)器處理成功,用戶終端(例如:瀏覽器)應(yīng)重置文檔視圖??赏ㄟ^此返回碼清除瀏覽器的表單域
206 Partial Content 部分內(nèi)容。服務(wù)器成功處理了部分GET請求
300 Multiple Choices 多種選擇。請求的資源可包括多個(gè)位置,相應(yīng)可返回一個(gè)資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇
301 Moved Permanently 永久移動(dòng)。請求的資源已被永久的移動(dòng)到新URI,返回信息會(huì)包括新的URI,瀏覽器會(huì)自動(dòng)定向到新URI。今后任何新的請求都應(yīng)使用新的URI代替
302 Found 臨時(shí)移動(dòng)。與301類似。但資源只是臨時(shí)被移動(dòng)??蛻舳藨?yīng)繼續(xù)使用原有URI
303 See Other 查看其它地址。與301類似。使用GET和POST請求查看
304 Not Modified 未修改。所請求的資源未修改,服務(wù)器返回此狀態(tài)碼時(shí),不會(huì)返回任何資源??蛻舳送ǔ?huì)緩存訪問過的資源,通過提供一個(gè)頭信息指出客戶端希望只返回在指定日期之后修改的資源
305 Use Proxy 使用代理。所請求的資源必須通過代理訪問
306 Unused 已經(jīng)被廢棄的HTTP狀態(tài)碼
307 Temporary Redirect 臨時(shí)重定向。與302類似。使用GET請求重定向
400 Bad Request 客戶端請求的語法錯(cuò)誤,服務(wù)器無法理解
401 Unauthorized 請求要求用戶的身份認(rèn)證
402 Payment Required 保留,將來使用
403 Forbidden 服務(wù)器理解請求客戶端的請求,但是拒絕執(zhí)行此請求
404 Not Found 服務(wù)器無法根據(jù)客戶端的請求找到資源(網(wǎng)頁)。通過此代碼,網(wǎng)站設(shè)計(jì)人員可設(shè)置"您所請求的資源無法找到"的個(gè)性頁面
405 Method Not Allowed 客戶端請求中的方法被禁止
406 Not Acceptable 服務(wù)器無法根據(jù)客戶端請求的內(nèi)容特性完成請求
407 Proxy Authentication Required 請求要求代理的身份認(rèn)證,與401類似,但請求者應(yīng)當(dāng)使用代理進(jìn)行授權(quán)
408 Request Time-out 服務(wù)器等待客戶端發(fā)送的請求時(shí)間過長,超時(shí)
409 Conflict 服務(wù)器完成客戶端的 PUT 請求時(shí)可能返回此代碼,服務(wù)器處理請求時(shí)發(fā)生了沖突
410 Gone 客戶端請求的資源已經(jīng)不存在。410不同于404,如果資源以前有現(xiàn)在被永久刪除了可使用410代碼,網(wǎng)站設(shè)計(jì)人員可通過301代碼指定資源的新位置
411 Length Required 服務(wù)器無法處理客戶端發(fā)送的不帶Content-Length的請求信息
412 Precondition Failed 客戶端請求信息的先決條件錯(cuò)誤
413 Request Entity Too Large 由于請求的實(shí)體過大,服務(wù)器無法處理,因此拒絕請求。為防止客戶端的連續(xù)請求,服務(wù)器可能會(huì)關(guān)閉連接。如果只是服務(wù)器暫時(shí)無法處理,則會(huì)包含一個(gè)Retry-After的響應(yīng)信息
414 Request-URI Too Large 請求的URI過長(URI通常為網(wǎng)址),服務(wù)器無法處理
415 Unsupported Media Type 服務(wù)器無法處理請求附帶的媒體格式
416 Requested range not satisfiable 客戶端請求的范圍無效
417 Expectation Failed 服務(wù)器無法滿足Expect的請求頭信息
500 Internal Server Error 服務(wù)器內(nèi)部錯(cuò)誤,無法完成請求
501 Not Implemented 服務(wù)器不支持請求的功能,無法完成請求
502 Bad Gateway 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請求時(shí),從遠(yuǎn)程服務(wù) 器接收到了一個(gè)無效的響應(yīng)
503 Service Unavailable 由于超載或系統(tǒng)維護(hù),服務(wù)器暫時(shí)的無法處理客戶端的請求。 延時(shí)的長度可包含在服務(wù)器的Retry-After頭信息中
504 Gateway Time-out 充當(dāng)網(wǎng)關(guān)或代理的服務(wù)器,未及時(shí)從遠(yuǎn)端服務(wù)器獲取請求
505 HTTP Version not supported 服務(wù)器不支持請求的HTTP協(xié)議的版本,無法完成處理

HTTP響應(yīng)頭

應(yīng)答頭 說明
Allow 服務(wù)器支持哪些請求方法(如GET、POST等)。
Content-Encoding 文檔的編碼(Encode)方法。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時(shí)間。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í)才需要這個(gè)數(shù)據(jù)。如果你想要利用持久連接的優(yōu)勢,可以把輸出文檔寫入 ByteArrayOutputStream,完成后查看其大小,然后把該值放入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提供了一個(gè)專用的方法setContentType。
Date 當(dāng)前的GMT時(shí)間。你可以用setDateHeader來設(shè)置這個(gè)頭以避免轉(zhuǎn)換時(shí)間格式的麻煩。
Expires 應(yīng)該在什么時(shí)候認(rèn)為文檔已經(jīng)過期,從而不再緩存它?
Last-Modified 文檔的最后改動(dòng)時(shí)間。客戶可以通過If-Modified-Since請求頭提供一個(gè)日期,該請求將被視為一個(gè)條件GET,只有改動(dòng)時(shí)間遲于指定時(shí)間的文檔才會(huì)返回,否則返回一個(gè)304(Not Modified)狀態(tài)。Last-Modified也可用setDateHeader方法來設(shè)置。
Location 表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n。Location通常不是直接設(shè)置的,而是通過HttpServletResponse的sendRedirect方法,該方法同時(shí)設(shè)置狀態(tài)代碼為302。
Refresh 表示瀏覽器應(yīng)該在多少時(shí)間之后刷新文檔,以秒計(jì)。除了刷新當(dāng)前文檔之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面.

注意這種功能通常是通過設(shè)置HTML頁面HEAD區(qū)的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實(shí)現(xiàn),這是因?yàn)?,自?dòng)刷新或重定向?qū)τ谀切┎荒苁褂肅GI或Servlet的HTML編寫者十分重要。但是,對于Servlet來說,直接設(shè)置Refresh頭更加方便。

注意Refresh的意義是"N秒之后刷新本頁面或訪問指定頁面",而不是"每隔N秒刷新本頁面或訪問指定頁面"。因此,連續(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è)置和頁面關(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)答中這個(gè)頭是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。

注意Servlet一般不進(jìn)行這方面的處理,而是讓W(xué)eb服務(wù)器的專門機(jī)制來控制受密碼保護(hù)頁面的訪問(例如.htaccess)。

HTTP content-Type

Content-Type,內(nèi)容類型,一般是指網(wǎng)頁中存在的Content-Type,用于定義網(wǎng)絡(luò)文件的類型和網(wǎng)頁的編碼,決定瀏覽器將以什么形式、什么編碼讀取這個(gè)文件,這就是經(jīng)??吹揭恍〢sp網(wǎng)頁點(diǎn)擊的結(jié)果卻是下載到的一個(gè)文件或一張圖片的原因。
Content-Type 標(biāo)頭告訴客戶端實(shí)際返回的內(nèi)容的內(nèi)容類型。

語法格式:

Content-Type: text/html; charset=utf-8 Content-Type:
multipart/form-data; boundary=something

常見的媒體格式類型如下:

? text/html : HTML格式
? text/plain :純文本格式
? text/xml : XML格式
? image/gif :gif圖片格式
? image/jpeg :jpg圖片格式
? image/png:png圖片格式

以application開頭的媒體格式類型:

? application/xhtml+xml :XHTML格式
? application/xml: XML數(shù)據(jù)格式
? application/atom+xml :Atom XML聚合格式
? application/json: JSON數(shù)據(jù)格式
? application/pdf:pdf格式
? application/msword : Word文檔格式
? application/octet-stream : 二進(jìn)制流數(shù)據(jù)(如常見的文件下載)
? application/x-www-form-urlencoded : <form
encType=””>中默認(rèn)的encType,form表單數(shù)據(jù)被編碼為key/value格式發(fā)送到服務(wù)器(表單默認(rèn)的提交數(shù)據(jù)的格式)

另外一種常見的媒體格式是上傳文件之時(shí)使用的:

? multipart/form-data : 需要在表單中進(jìn)行文件上傳時(shí),就需要使用該格式

實(shí)例
下面實(shí)例是一點(diǎn)典型的使用GET來傳遞數(shù)據(jù)的實(shí)例:

客戶端請求:

GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

服務(wù)端響應(yīng):

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain

輸出結(jié)果:

Hello World! My payload includes a trailing CRLF.

關(guān)于HTTP請求GET和POST的區(qū)別

1.提交
GET提交,請求的數(shù)據(jù)會(huì)附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭<request-line>中),以?分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)用&連接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進(jìn)制表示的ASCII。
POST提交:把提交的數(shù)據(jù)放置在是HTTP包的包體<request-body>中。上文示例中紅色字體標(biāo)明的就是實(shí)際的傳輸數(shù)據(jù)
因此,GET提交的數(shù)據(jù)會(huì)在地址欄中顯示出來,而POST提交,地址欄不會(huì)改變

2.傳輸數(shù)據(jù)的大?。?/strong>
首先聲明,HTTP協(xié)議沒有對傳輸?shù)臄?shù)據(jù)大小進(jìn)行限制,HTTP協(xié)議規(guī)范也沒有對URL長度進(jìn)行限制。 而在實(shí)際開發(fā)中存在的限制主要有:
GET:特定瀏覽器和服務(wù)器對URL長度有限制,例如IE對URL長度的限制是2083字節(jié)(2K+35)。對于其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決于操作系統(tǒng)的支持。
因此對于GET提交時(shí),傳輸數(shù)據(jù)就會(huì)受到URL長度的限制。
POST:由于不是通過URL傳值,理論上數(shù)據(jù)不受限。但實(shí)際各個(gè)WEB服務(wù)器會(huì)規(guī)定對post提交數(shù)據(jù)大小進(jìn)行限制,Apache、IIS6都有各自的配置。

3.安全性:
POST的安全性要比GET的安全性高。注意:這里所說的安全性和上面GET提到的“安全”不是同個(gè)概念。上面“安全”的含義僅僅是不作數(shù)據(jù)修改,而這里安全的含義是真正的Security的含義,比如:通過GET提交數(shù)據(jù),用戶名和密碼將明文出現(xiàn)在URL上,因?yàn)?1)登錄頁面有可能被瀏覽器緩存, (2)其他人查看瀏覽器的歷史紀(jì)錄,那么別人就可以拿到你的賬號和密碼了,

內(nèi)容參考:菜鳥教程 https://www.runoob.com/http/http-content-type.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容