詳解Http協(xié)議以及post與get區(qū)別
一、什么是HTTP協(xié)議
HTTP是hypertext transfer protocol(超文本傳輸協(xié)議)的簡(jiǎn)寫(xiě),它是TCP/IP協(xié)議的一個(gè)應(yīng)用層協(xié)議,用于定義WEB瀏覽器與WEB服務(wù)器之間交換數(shù)據(jù)的過(guò)程。客戶(hù)端連上web服務(wù)器后,若想獲得web服務(wù)器中的某個(gè)web資源,需遵守一定的通訊格式,HTTP協(xié)議用于定義客戶(hù)端與web服務(wù)器通迅的格式。
二、HTTP協(xié)議的版本
HTTP協(xié)議的版本:HTTP/1.0、HTTP/1.1
三、HTTP1.0和HTTP1.1的區(qū)別
在HTTP1.0協(xié)議中,客戶(hù)端與web服務(wù)器建立連接后,只能獲得一個(gè)web資源。
在HTTP1.1協(xié)議,允許客戶(hù)端與web服務(wù)器建立連接后,在一個(gè)連接上獲取多個(gè)web資源。
四、HTTP請(qǐng)求
4.1、HTTP請(qǐng)求包括的內(nèi)容
客戶(hù)端連上服務(wù)器后,向服務(wù)器請(qǐng)求某個(gè)web資源,稱(chēng)之為客戶(hù)端向服務(wù)器發(fā)送了一個(gè)HTTP請(qǐng)求。
一個(gè)完整的HTTP請(qǐng)求包括如下內(nèi)容:一個(gè)請(qǐng)求行、若干消息頭、以及實(shí)體內(nèi)容
范例:
4.2、HTTP請(qǐng)求的細(xì)節(jié)——請(qǐng)求行
請(qǐng)求行中的GET稱(chēng)之為請(qǐng)求方式,請(qǐng)求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST
用戶(hù)如果沒(méi)有設(shè)置,默認(rèn)情況下瀏覽器向服務(wù)器發(fā)送的都是get請(qǐng)求,例如在瀏覽器直接輸?shù)刂吩L問(wèn),點(diǎn)超鏈接訪問(wèn)等都是get,用戶(hù)如想把請(qǐng)求方式改為post,可通過(guò)更改表單的提交方式實(shí)現(xiàn)。
不管POST或GET,都用于向服務(wù)器請(qǐng)求某個(gè)WEB資源,這兩種方式的區(qū)別主要表現(xiàn)在數(shù)據(jù)傳遞上:如果請(qǐng)求方式為GET方式,則可以在請(qǐng)求的URL地址后以?的形式帶上交給服務(wù)器的數(shù)據(jù),多個(gè)數(shù)據(jù)之間以&進(jìn)行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特點(diǎn):在URL地址后附帶的參數(shù)是有限制的,其數(shù)據(jù)容量通常不能超過(guò)1K。
如果請(qǐng)求方式為POST方式,則可以在請(qǐng)求的實(shí)體內(nèi)容中向服務(wù)器發(fā)送數(shù)據(jù),Post方式的特點(diǎn):傳送的數(shù)據(jù)量無(wú)限制。
HTTP請(qǐng)求的方法:
HTTP/1.1協(xié)議中共定義了八種方法(有時(shí)也叫“動(dòng)作”),來(lái)表明Request-URL指定的資源不同的操作方式
- OPTIONS:返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法,也可以利用向web服務(wù)器發(fā)送‘*'的請(qǐng)求來(lái)測(cè)試服務(wù)器的功能性
- HEAD:向服務(wù)器索與GET請(qǐng)求相一致的響應(yīng),只不過(guò)響應(yīng)體將不會(huì)被返回。這一方法可以再不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)小消息頭中的元信息。
- GET:向特定的資源發(fā)出請(qǐng)求。它本質(zhì)就是發(fā)送一個(gè)請(qǐng)求來(lái)取得服務(wù)器上的某一資源。資源通過(guò)一組HTTP頭和呈現(xiàn)數(shù)據(jù)(如HTML文本,或者圖片或者視頻等)返回給客戶(hù)端。GET請(qǐng)求中,永遠(yuǎn)不會(huì)包含呈現(xiàn)數(shù)據(jù)。
- POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。 Loadrunner中對(duì)應(yīng)POST請(qǐng)求函數(shù):web_submit_data,web_submit_form
- PUT:向指定資源位置上傳其最新內(nèi)容
- DELETE:請(qǐng)求服務(wù)器刪除Request-URL所標(biāo)識(shí)的資源
- TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷
- CONNECT:HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
注意:
1)方法名稱(chēng)是區(qū)分大小寫(xiě)的,當(dāng)某個(gè)請(qǐng)求所針對(duì)的資源不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候,服務(wù)器應(yīng)當(dāng)返回狀態(tài)碼405(Mothod Not Allowed);當(dāng)服務(wù)器不認(rèn)識(shí)或者不支持對(duì)應(yīng)的請(qǐng)求方法時(shí),應(yīng)返回狀態(tài)碼501(Not Implemented)。
2)HTTP服務(wù)器至少應(yīng)該實(shí)現(xiàn)GET和HEAD/POST方法,其他方法都是可選的,此外除上述方法,特定的HTTP服務(wù)器支持?jǐn)U展自定義的方法。
GET和POST的區(qū)別
1.標(biāo)準(zhǔn)答案
GET在瀏覽器回退時(shí)是無(wú)害的,而POST會(huì)再次提交請(qǐng)求。GET產(chǎn)生的URL地址可以被Bookmark,而POST不可以。GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì),除非手動(dòng)設(shè)置。GET請(qǐng)求只能進(jìn)行url編碼,而POST支持多種編碼方式。GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會(huì)被保留。GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,而POST沒(méi)有。對(duì)參數(shù)的數(shù)據(jù)類(lèi)型,GET只接受ASCII字符,而POST沒(méi)有限制。GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上,所以不能用來(lái)傳遞敏感信息。GET參數(shù)通過(guò)URL傳遞,POST放在Request body中。
2.深入答案
GET和POST是HTTP協(xié)議中的兩種發(fā)送請(qǐng)求的方法。HTTP是基于TCP/IP關(guān)于數(shù)據(jù)如何在萬(wàn)維網(wǎng)中如何通信的協(xié)議。(HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說(shuō),GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數(shù),技術(shù)上是完全行的通的。)GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。(對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù));而對(duì)于POST,瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù)))
4.3、HTTP請(qǐng)求的細(xì)節(jié)——消息頭
HTTP請(qǐng)求中的常用消息頭
accept:——瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,它所支持的數(shù)據(jù)類(lèi)型Accept-Charset: ——瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,它支持哪種字符集Accept-Encoding:——瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,支持的壓縮格式Accept-Language:——瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,它的語(yǔ)言環(huán)境Host:——瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,想訪問(wèn)哪臺(tái)主機(jī)If-Modified-Since:—— 瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,緩存數(shù)據(jù)的時(shí)間Referer:——瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,客戶(hù)機(jī)是哪個(gè)頁(yè)面來(lái)的 防盜鏈Connection:——瀏覽器通過(guò)這個(gè)頭告訴服務(wù)器,請(qǐng)求完后是斷開(kāi)鏈接還是何持鏈接
例如:
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Accept: application/x<span class="hljs-attribute" style="box-sizing: border-box;">-ms</span><span class="hljs-attribute" style="box-sizing: border-box;">-application</span>, image/jpeg, application/xaml<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">xml</span>, image/gif, image/pjpeg, application/x<span class="hljs-attribute" style="box-sizing: border-box;">-ms</span><span class="hljs-attribute" style="box-sizing: border-box;">-xbap</span>, application/vnd<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>ms<span class="hljs-attribute" style="box-sizing: border-box;">-excel</span>, application/vnd<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>ms<span class="hljs-attribute" style="box-sizing: border-box;">-powerpoint</span>, application/msword, <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Referer: http://localhost:8080/JavaWebDemoProject/Web/2.jsp Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3) Accept-Encoding: gzip, deflate Host: localhost:8080 Connection: Keep-Alive</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
五、HTTP響應(yīng)
5.1、HTTP響應(yīng)包括的內(nèi)容
一個(gè)HTTP響應(yīng)代表服務(wù)器向客戶(hù)端回送的數(shù)據(jù),它包括: 一個(gè)狀態(tài)行、若干消息頭、以及實(shí)體內(nèi)容 。
范例:
<code class="hljs http has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-status" style="color: rgb(0, 0, 136); box-sizing: border-box;">HTTP/1.1 <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">200</span> OK</span> <span class="hljs-attribute" style="box-sizing: border-box;">Server</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">Apache-Coyote/1.1</span> <span class="hljs-attribute" style="box-sizing: border-box;">Content-Type</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">text/html;charset=ISO-8859-1</span> <span class="hljs-attribute" style="box-sizing: border-box;">Content-Length</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">105</span> <span class="hljs-attribute" style="box-sizing: border-box;">Date</span>: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">Tue, 27 May 2014 16:23:28 GMT</span> <span class="xml" style="box-sizing: border-box;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">html</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">head</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">title</span>></span>Hello World JSP<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">title</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">head</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">body</span>></span> Hello World! <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">body</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">html</span>></span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>
5.2、HTTP響應(yīng)的細(xì)節(jié)——狀態(tài)行
狀態(tài)行格式: HTTP版本號(hào) 狀態(tài)碼 原因敘述
舉例:HTTP/1.1 200 OK
2開(kāi)頭 (請(qǐng)求成功)表示成功處理了請(qǐng)求的狀態(tài)代碼。
200 (成功) 服務(wù)器已成功處理了請(qǐng)求。 通常,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁(yè)。
201 (已創(chuàng)建) 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源。
202 (已接受) 服務(wù)器已接受請(qǐng)求,但尚未處理。
203 (非授權(quán)信息) 服務(wù)器已成功處理了請(qǐng)求,但返回的信息可能來(lái)自另一來(lái)源。
204 (無(wú)內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
205 (重置內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
206 (部分內(nèi)容) 服務(wù)器成功處理了部分 GET 請(qǐng)求。
3開(kāi)頭 (請(qǐng)求被重定向)表示要完成請(qǐng)求,需要進(jìn)一步操作。 通常,這些狀態(tài)代碼用來(lái)重定向。
300 (多種選擇) 針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作。 服務(wù)器可根據(jù)請(qǐng)求者 (user agent) 選擇一項(xiàng)操作,或提供操作列表供請(qǐng)求者選擇。
301 (永久移動(dòng)) 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。 服務(wù)器返回此響應(yīng)(對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí),會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。
302 (臨時(shí)移動(dòng)) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求。
303 (查看其他位置) 請(qǐng)求者應(yīng)當(dāng)對(duì)不同的位置使用單獨(dú)的 GET 請(qǐng)求來(lái)檢索響應(yīng)時(shí),服務(wù)器返回此代碼。
304 (未修改) 自從上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò)。 服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容。
305 (使用代理) 請(qǐng)求者只能使用代理訪問(wèn)請(qǐng)求的網(wǎng)頁(yè)。 如果服務(wù)器返回此響應(yīng),還表示請(qǐng)求者應(yīng)使用代理。
307 (臨時(shí)重定向) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求。
4開(kāi)頭 (請(qǐng)求錯(cuò)誤)這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。
400 (錯(cuò)誤請(qǐng)求) 服務(wù)器不理解請(qǐng)求的語(yǔ)法。
401 (未授權(quán)) 請(qǐng)求要求身份驗(yàn)證。 對(duì)于需要登錄的網(wǎng)頁(yè),服務(wù)器可能返回此響應(yīng)。
403 (禁止) 服務(wù)器拒絕請(qǐng)求。
404 (未找到) 服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。
405 (方法禁用) 禁用請(qǐng)求中指定的方法。
406 (不接受) 無(wú)法使用請(qǐng)求的內(nèi)容特性響應(yīng)請(qǐng)求的網(wǎng)頁(yè)。
407 (需要代理授權(quán)) 此狀態(tài)代碼與 401(未授權(quán))類(lèi)似,但指定請(qǐng)求者應(yīng)當(dāng)授權(quán)使用代理。
408 (請(qǐng)求超時(shí)) 服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí)。
409 (沖突) 服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突。 服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息。
410 (已刪除) 如果請(qǐng)求的資源已永久刪除,服務(wù)器就會(huì)返回此響應(yīng)。
411 (需要有效長(zhǎng)度) 服務(wù)器不接受不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求。
412 (未滿(mǎn)足前提條件) 服務(wù)器未滿(mǎn)足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件。
413 (請(qǐng)求實(shí)體過(guò)大) 服務(wù)器無(wú)法處理請(qǐng)求,因?yàn)檎?qǐng)求實(shí)體過(guò)大,超出服務(wù)器的處理能力。
414 (請(qǐng)求的 URI 過(guò)長(zhǎng)) 請(qǐng)求的 URI(通常為網(wǎng)址)過(guò)長(zhǎng),服務(wù)器無(wú)法處理。
415 (不支持的媒體類(lèi)型) 請(qǐng)求的格式不受請(qǐng)求頁(yè)面的支持。
416 (請(qǐng)求范圍不符合要求) 如果頁(yè)面無(wú)法提供請(qǐng)求的范圍,則服務(wù)器會(huì)返回此狀態(tài)代碼。
417 (未滿(mǎn)足期望值) 服務(wù)器未滿(mǎn)足"期望"請(qǐng)求標(biāo)頭字段的要求。
5開(kāi)頭(服務(wù)器錯(cuò)誤)這些狀態(tài)代碼表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。 這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤,而不是請(qǐng)求出錯(cuò)。
500 (服務(wù)器內(nèi)部錯(cuò)誤) 服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求。
501 (尚未實(shí)施) 服務(wù)器不具備完成請(qǐng)求的功能。 例如,服務(wù)器無(wú)法識(shí)別請(qǐng)求方法時(shí)可能會(huì)返回此代碼。
502 (錯(cuò)誤網(wǎng)關(guān)) 服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無(wú)效響應(yīng)。
503 (服務(wù)不可用) 服務(wù)器目前無(wú)法使用(由于超載或停機(jī)維護(hù))。 通常,這只是暫時(shí)狀態(tài)。
504 (網(wǎng)關(guān)超時(shí)) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒(méi)有及時(shí)從上游服務(wù)器收到請(qǐng)求。
505 (HTTP 版本不受支持) 服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本。
5.3、HTTP響應(yīng)細(xì)節(jié)——常用響應(yīng)頭
HTTP響應(yīng)中的常用響應(yīng)頭(消息頭)
- Location: 服務(wù)器通過(guò)這個(gè)頭,來(lái)告訴瀏覽器跳到哪里
- Server:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器服務(wù)器的型號(hào)
- Content-Encoding:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器,數(shù)據(jù)的壓縮格式
- Content-Length: 服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器回送數(shù)據(jù)的長(zhǎng)度
- Content-Language:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器語(yǔ)言環(huán)境
- Content-Type:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器回送數(shù)據(jù)的類(lèi)型
- Refresh:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器定時(shí)刷新
- Content-Disposition:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器以下載方式打數(shù)據(jù)
- Transfer-Encoding:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器數(shù)據(jù)是以分塊方式回送的
- Expires: -1 控制瀏覽器不要緩存
- Cache-Control: no-cache
- Pragma:no-cache
HTTP與HTTPS的區(qū)別
超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息,HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息,因此,HTTP協(xié)議不適合傳輸一些敏感信息,比如:信用卡號(hào)、密碼等支付信息。
為了解決HTTP協(xié)議的這一缺陷,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS,為了數(shù)據(jù)傳輸?shù)陌踩?,HTTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議,SSL依靠證書(shū)來(lái)驗(yàn)證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密。
一、HTTP和HTTPS的基本概念
HTTP:是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個(gè)客戶(hù)端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP),用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。
HTTPS:是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。
HTTPS協(xié)議的主要作用可以分為兩種:一種是建立一個(gè)信息安全通道,來(lái)保證數(shù)據(jù)傳輸?shù)陌踩?;另一種就是確認(rèn)網(wǎng)站的真實(shí)性。
二、HTTP與HTTPS有什么區(qū)別?
HTTP協(xié)議傳輸?shù)臄?shù)據(jù)都是未加密的,也就是明文的,因此使用HTTP協(xié)議傳輸隱私信息非常不安全,為了保證這些隱私數(shù)據(jù)能加密傳輸,于是網(wǎng)景公司設(shè)計(jì)了SSL(Secure Sockets Layer)協(xié)議用于對(duì)HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而就誕生了HTTPS。簡(jiǎn)單來(lái)說(shuō),HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全。
HTTPS和HTTP的區(qū)別主要如下:
- https協(xié)議需要到ca申請(qǐng)證書(shū),一般免費(fèi)證書(shū)較少,因而需要一定費(fèi)用。
- http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
- http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
- http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。
三、HTTPS的工作原理
我們都知道HTTPS能夠加密信息,以免敏感信息被第三方獲取,所以很多銀行網(wǎng)站或電子郵箱等等安全級(jí)別較高的服務(wù)都會(huì)采用HTTPS協(xié)議。
客戶(hù)端在使用HTTPS方式與Web服務(wù)器通信時(shí)有以下幾個(gè)步驟,如圖所示。
- 客戶(hù)使用https的URL訪問(wèn)Web服務(wù)器,要求與Web服務(wù)器建立SSL連接。
- Web服務(wù)器收到客戶(hù)端請(qǐng)求后,會(huì)將網(wǎng)站的證書(shū)信息(證書(shū)中包含公鑰)傳送一份給客戶(hù)端。
- 客戶(hù)端的瀏覽器與Web服務(wù)器開(kāi)始協(xié)商SSL連接的安全等級(jí),也就是信息加密的等級(jí)。
- 客戶(hù)端的瀏覽器根據(jù)雙方同意的安全等級(jí),建立會(huì)話密鑰,然后利用網(wǎng)站的公鑰將會(huì)話密鑰加密,并傳送給網(wǎng)站。
- Web服務(wù)器利用自己的私鑰解密出會(huì)話密鑰。
- Web服務(wù)器利用會(huì)話密鑰加密與客戶(hù)端之間的通信。
四、HTTPS的優(yōu)點(diǎn)
盡管HTTPS并非絕對(duì)安全,掌握根證書(shū)的機(jī)構(gòu)、掌握加密算法的組織同樣可以進(jìn)行中間人形式的攻擊,但HTTPS仍是現(xiàn)行架構(gòu)下最安全的解決方案,主要有以下幾個(gè)好處:
- 使用HTTPS協(xié)議可認(rèn)證用戶(hù)和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶(hù)機(jī)和服務(wù)器;
- HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全,可防止數(shù)據(jù)在傳輸過(guò)程中不被竊取、改變,確保數(shù)據(jù)的完整性。
- HTTPS是現(xiàn)行架構(gòu)下最安全的解決方案,雖然不是絕對(duì)安全,但它大幅增加了中間人攻擊的成本。
- 谷歌曾在2014年8月份調(diào)整搜索引擎算法,并稱(chēng)“比起同等HTTP網(wǎng)站,采用HTTPS加密的網(wǎng)站在搜索結(jié)果中的排名將會(huì)更高”。
五、HTTPS的缺點(diǎn)
雖然說(shuō)HTTPS有很大的優(yōu)勢(shì),但其相對(duì)來(lái)說(shuō),還是存在不足之處的:
- HTTPS協(xié)議握手階段比較費(fèi)時(shí),會(huì)使頁(yè)面的加載時(shí)間延長(zhǎng)近50%,增加10%到20%的耗電;
- HTTPS連接緩存不如HTTP高效,會(huì)增加數(shù)據(jù)開(kāi)銷(xiāo)和功耗,甚至已有的安全措施也會(huì)因此而受到影響;
- SSL證書(shū)需要錢(qián),功能越強(qiáng)大的證書(shū)費(fèi)用越高,個(gè)人網(wǎng)站、小網(wǎng)站沒(méi)有必要一般不會(huì)用。
- SSL證書(shū)通常需要綁定IP,不能在同一IP上綁定多個(gè)域名,IPv4資源不可能支撐這個(gè)消耗。
- HTTPS協(xié)議的加密范圍也比較有限,在黑客攻擊、拒絕服務(wù)攻擊、服務(wù)器劫持等方面幾乎起不到什么作用。最關(guān)鍵的,SSL證書(shū)的信用鏈體系并不安全,特別是在某些國(guó)家可以控制CA根證書(shū)的情況下,中間人攻擊一樣可行。
六、http切換到HTTPS
如果需要將網(wǎng)站從http切換到https到底該如何實(shí)現(xiàn)呢?
這里需要將頁(yè)面中所有的鏈接,例如js,css,圖片等等鏈接都由http改為https。例如:http://www.baidu.com改為https://www.baidu.com
BTW,這里雖然將http切換為了https,還是建議保留http。所以我們?cè)谇袚Q的時(shí)候可以做http和https的兼容,具體實(shí)現(xiàn)方式是,去掉頁(yè)面鏈接中的http頭部,這樣可以自動(dòng)匹配http頭和https頭。例如:將http://www.baidu.com改為//www.baidu.com。然后當(dāng)用戶(hù)從http的入口進(jìn)入訪問(wèn)頁(yè)面時(shí),頁(yè)面就是http,如果用戶(hù)是從https的入口進(jìn)入訪問(wèn)頁(yè)面,頁(yè)面即使https的。
到此這篇關(guān)于詳解Http協(xié)議以及post與get區(qū)別的文章就介紹到這了,更多相關(guān)Http協(xié)議以及post與get區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳細(xì)講解HTTP協(xié)議工作方式
- 詳細(xì)HTTP協(xié)議的前世今生
- 詳解HTTP協(xié)議簡(jiǎn)介
- 詳解HTTP協(xié)議(很經(jīng)典)
- HTTP協(xié)議詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- HTTP協(xié)議入門(mén)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- HTTP協(xié)議簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- 網(wǎng)絡(luò)傳輸協(xié)議(http協(xié)議)
- http協(xié)議詳解(超詳細(xì))
- HTTP協(xié)議詳細(xì)介紹
相關(guān)文章
SpringBoot+WebMagic實(shí)現(xiàn)網(wǎng)頁(yè)爬蟲(chóng)的示例代碼
本文是對(duì)spring?boot+WebMagic+MyBatis做了整合,使用WebMagic爬取數(shù)據(jù),然后通過(guò)MyBatis持久化爬取的數(shù)據(jù)到mysql數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10在SpringBoot中,如何使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用方法總結(jié)
我們?cè)谶M(jìn)行網(wǎng)絡(luò)連接的時(shí)候,建立套接字連接是一個(gè)非常消耗性能的事情,特別是在分布式的情況下,用線程池去保持多個(gè)客戶(hù)端連接,是一種非常消耗線程的行為.那么我們?cè)撏ㄟ^(guò)什么技術(shù)去解決上述的問(wèn)題呢,那么就不得不提一個(gè)網(wǎng)絡(luò)連接的利器——Netty,需要的朋友可以參考下2021-06-06Java實(shí)現(xiàn)兩個(gè)隨機(jī)數(shù)組合并進(jìn)行排序的方法
本文主要介紹了Java實(shí)現(xiàn)兩個(gè)隨機(jī)數(shù)組合并進(jìn)行排序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09springboot讀取自定義配置文件節(jié)點(diǎn)的方法
這篇文章主要介紹了springboot讀取自定義配置文件節(jié)點(diǎn)的方法,本文給大家介紹的非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-05-05Java8函數(shù)式接口java.util.function速查大全
因?yàn)镴ava8引入了函數(shù)式接口,在java.util.function包含了幾大類(lèi)函數(shù)式接口聲明,這篇文章主要給大家介紹了關(guān)于Java8函數(shù)式接口java.util.function速查的相關(guān)資料,需要的朋友可以參考下2021-08-08