Http協(xié)議詳解
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-10-02 08:00:00 閱讀次數(shù):2986次
HTTP協(xié)議即超文本傳輸協(xié)議,這個(gè)協(xié)議詳細(xì)規(guī)定了瀏覽器和萬(wàn)維網(wǎng)之間互相通信的規(guī)則。HTTP協(xié)議就是一個(gè)通信的規(guī)則,通信規(guī)則規(guī)定了客戶端發(fā)送給服務(wù)器的內(nèi)容格式,也規(guī)定了服務(wù)器發(fā)送給客戶端的內(nèi)容格式。其實(shí)我們要學(xué)的就是這兩種格式。客戶端發(fā)送給服務(wù)器的格式叫做請(qǐng)求協(xié)議,服務(wù)器發(fā)送給客戶端的叫做響應(yīng)協(xié)議。
一、請(qǐng)求協(xié)議
請(qǐng)求協(xié)議的格式如下:
請(qǐng)求首行;
請(qǐng)求頭信息;
空行;
請(qǐng)求體;
|
瀏覽器發(fā)送給服務(wù)器的內(nèi)容就是這個(gè)格式的。如果不是這個(gè)格式,服務(wù)器不會(huì)解讀。在HTTP協(xié)議中,請(qǐng)求有很多方法,其中最常見的就是post和get方法。不同的方法會(huì)有所區(qū)別。我們可以通過(guò)HttpWatch觀察到瀏覽器與服務(wù)器之間的請(qǐng)求信息和響應(yīng)欣喜的格式。
GET請(qǐng)求
在myeclipse中創(chuàng)建一個(gè)web工程,在地址欄中輸入訪問(wèn)地址:http://127.0.0.1:8080/HttpDemo/index.jsp之后,我們可以在Chrome中查看瀏覽器向服務(wù)器發(fā)送的get請(qǐng)求,請(qǐng)求的格式如下所示:
GET /HttpDemo/index.jsp?userName=min&password=lingchao HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Referer: http://127.0.0.1:8080/HttpDemo/index.jsp
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=57C3302F3350676F65B5E4409ABA87CF
- GET /HttpDemo/index.jsp?userName=min&password=lingchao HTTP/1.1:GET請(qǐng)求,請(qǐng)求的路徑為 /HttpDemo/index.jsp?userName=min&password=lingchao,協(xié)議及版本為:HTTP/1.1
- Host: 127.0.0.1:8080:請(qǐng)求的主機(jī)名為127.0.0.1:8080
- User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.198:與瀏覽器和操作系統(tǒng)有關(guān)的信息,有些網(wǎng)站會(huì)顯示用戶的系統(tǒng)版本和瀏覽器的版本信息,這都是通過(guò)獲取該頭部得到的。
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8:告訴服務(wù)器當(dāng)前客戶端可以接收的文檔的類型。其實(shí)這里包含了*/*,就表示什么都可以接收;
- Accept-Language: zh-CN,zh;q=0.8:當(dāng)前客戶端可以支持的語(yǔ)言,在瀏覽器的工具->選項(xiàng)中可以得到相關(guān)信息
- Accept-Encoding: gzip,deflate,sdch:客戶端支持的編碼
- Connection: keep-alive:客戶端支持的連接方式,保持一段連接,默認(rèn)為3000ms
- Cookie: JSESSIONID=57C3302F3350676F65B5E4409ABA87CF:因?yàn)椴皇堑谝淮卧L問(wèn)這個(gè)地址,所以在請(qǐng)求上會(huì)把上一次服務(wù)器響應(yīng)中發(fā)送過(guò)來(lái)的Cookie在請(qǐng)求中一并發(fā)送過(guò)去。
POST請(qǐng)求
POST /HttpDemo/index.jsp HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Content-Length: 28
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://127.0.0.1:8080/HttpDemo/index.jsp
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=57C3302F3350676F65B5E4409ABA87CF
POST請(qǐng)求時(shí)可以有體的,而GET請(qǐng)求不能有請(qǐng)求體。
- Referer: http://127.0.0.1:8080/HttpDemo/index.jsp:請(qǐng)求來(lái)自哪個(gè)頁(yè)面,例如在百度上點(diǎn)擊鏈接到了這里,那么Referer:http://www.baidu.com;如果你是在瀏覽器的地址欄里輸入,那么久沒有這個(gè)Referer請(qǐng)求頭了
- Content-Type: application/x-www-form-urlencoded:表單的數(shù)據(jù)類型,說(shuō)明會(huì)使用url編碼。url編碼的數(shù)據(jù)都是以“%”為前綴,后面跟隨兩位的16進(jìn)制
- Content-Length: 28:請(qǐng)求體的長(zhǎng)度,這里表示28個(gè)字節(jié)
- userName=min&password=111217:請(qǐng)求題內(nèi)容,hello是在表單中輸入的數(shù)據(jù)。userName,password是表單字段的名字,=后面是輸入的數(shù)據(jù),多個(gè)字段中間使用&連接
Referer請(qǐng)求頭是比較有用的一個(gè)請(qǐng)求頭,它可以用來(lái)做統(tǒng)計(jì)工作,也可以用來(lái)做防盜鏈。
統(tǒng)計(jì)工作:我公司網(wǎng)站在百度上做了廣告,但不知道在百度上做廣告對(duì)我們網(wǎng)站的訪問(wèn)量是否有影響,那么可以對(duì)每個(gè)請(qǐng)求中的Referer進(jìn)行分析,如果Referer為百度的很多,那么說(shuō)明用戶都是通過(guò)百度找到我們公司網(wǎng)站的。
防盜鏈:我公司網(wǎng)站上有一個(gè)下載鏈接,而其他網(wǎng)站盜鏈了這個(gè)地址,例如在我網(wǎng)站上的index.html頁(yè)面中有一個(gè)鏈接,點(diǎn)擊即可下載JDK7.0,但有某個(gè)人的微博中盜鏈了這個(gè)資源,它也有一個(gè)鏈接指向我們網(wǎng)站的JDK7.0,也就是說(shuō)登錄它的微博,點(diǎn)擊鏈接就可以從我網(wǎng)站上下載JDK7.0,這導(dǎo)致我們網(wǎng)站的廣告沒有看,但下載的卻是我網(wǎng)站的資源。這時(shí)可以使用Referer進(jìn)行防盜鏈,在資源被下載之前,我們對(duì)Referer進(jìn)行判斷,如果請(qǐng)求來(lái)自本網(wǎng)站,那么允許下載,如果非本網(wǎng)站,先跳轉(zhuǎn)到本網(wǎng)站看廣告,然后再允許下載。
二、響應(yīng)協(xié)議
響應(yīng)協(xié)議的格式如下:
響應(yīng)首行;
響應(yīng)頭信息;
空行;
響應(yīng)體;
|
響應(yīng)內(nèi)容是由服務(wù)器發(fā)送給瀏覽器的內(nèi)容,瀏覽器會(huì)根據(jù)響應(yīng)內(nèi)容來(lái)顯示。
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 809
Date: Sat, 27 Sep 2014 06:04:21 GMT
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="http://127.0.0.1:8080/HttpDemo/">
<title>My JSP 'index.jsp' starting page</title>
<span style="white-space:pre"> </span><meta http-equiv="pragma" content="no-cache">
<span style="white-space:pre"> </span><meta http-equiv="cache-control" content="no-cache">
<span style="white-space:pre"> </span><meta http-equiv="expires" content="0">
<span style="white-space:pre"> </span><meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<span style="white-space:pre"> </span><meta http-equiv="description" content="This is my page">
<span style="white-space:pre"> </span><!--
<span style="white-space:pre"> </span><link rel="stylesheet" type="text/css" href="styles.css">
<span style="white-space:pre"> </span>-->
</head>
<body>
<form action="index.jsp" method="post">
UserName:<input name="userName" id="userName">
Password:<input name="password" id="password">
<button type="submit">Submit </button>
</form>
</body>
</html>
HTTP/1.1 200 OK:響應(yīng)協(xié)議為HTTP1.1,狀態(tài)碼為200,表示請(qǐng)求成功,OK是對(duì)狀態(tài)碼的解釋;
Server: Apache-Coyote/1.1:服務(wù)器的版本信息;
Content-Type: text/html;charset=UTF-8:響應(yīng)體使用的編碼為UTF-8;
Content-Length: 724:響應(yīng)體為724字節(jié);
Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:響應(yīng)給客戶端的Cookie;
Date: Wed, 25 Sep 2012 04:15:03 GMT:響應(yīng)的時(shí)間,這可能會(huì)有8小時(shí)的時(shí)區(qū)差;
GET和POST的區(qū)別
- get是從服務(wù)器上獲取數(shù)據(jù)而post是向服務(wù)器傳送數(shù)據(jù)
- get是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的ACTION屬性所指的URL中。值和表單中相應(yīng)的字段一一對(duì)應(yīng),在URL中可以看到。post是通過(guò)HTTP 的post機(jī)制,將表單中各個(gè)字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶看不到這個(gè)過(guò)程
- 對(duì)于get方式,服務(wù)器端用requestQueryString獲取變量的值。對(duì)于post方式服務(wù)器用Request.form獲取提交數(shù)據(jù)
- get傳輸?shù)臄?shù)據(jù)量較小,不能大于2kb,post傳輸?shù)臄?shù)據(jù)量比較大,一般默認(rèn)為不受限制。但是理論上,IIS4中最大量為80kb,IIS5中最大量為100kb
- get安全性非常低,post安全性較高。但是執(zhí)行效率卻比post方法好。
響應(yīng)碼
響應(yīng)碼對(duì)于瀏覽器來(lái)說(shuō),很重要,它說(shuō)明了響應(yīng)的真正含義。例如200表示請(qǐng)求成功,302表示重定向,這說(shuō)明瀏覽器需要再發(fā)送一個(gè)新的請(qǐng)求。
- 200:請(qǐng)求成功,瀏覽器會(huì)把響應(yīng)體的內(nèi)容(通常是html顯示在瀏覽器中
- 404:請(qǐng)求的資源沒找到,說(shuō)明客戶端錯(cuò)誤的請(qǐng)求了不存在的資源。
- 500:請(qǐng)求的資源找到了,但是服務(wù)器內(nèi)部出現(xiàn)了錯(cuò)誤
- 302:重定向,當(dāng)響應(yīng)碼為302時(shí),表示服務(wù)器要求瀏覽器重新發(fā)送一個(gè)請(qǐng)求,服務(wù)器會(huì)發(fā)送一個(gè)響應(yīng)頭Location,它指定了請(qǐng)求的URL地址
- 304:當(dāng)用戶第一次請(qǐng)求index.html時(shí),服務(wù)器會(huì)添加一個(gè)名字為L(zhǎng)ast-Modified響應(yīng)頭,這個(gè)響應(yīng)頭說(shuō)明了index.html的最后修改時(shí)間,瀏覽器會(huì)把index.html內(nèi)容,以及最后響應(yīng)時(shí)間緩存下來(lái)。當(dāng)用戶第二次請(qǐng)求index.html時(shí),在請(qǐng)求中包含一個(gè)名為if-Modified-Since請(qǐng)求頭,它的值就是第一次請(qǐng)求時(shí)服務(wù)器通過(guò)Last-Modified響應(yīng)頭發(fā)給瀏覽器的值,即index.htmI最后的修改時(shí)間,If-Modified-Since請(qǐng)求頭就是在告訴服務(wù)器,我這里瀏覽器緩存的index.html最后修改時(shí)間是這個(gè),您看看現(xiàn)在的index.html最后修改時(shí)間是不是這個(gè),如果還是,那么您就不用再響應(yīng)這個(gè)index.html內(nèi)容了,我會(huì)把緩存的內(nèi)容直接顯示出來(lái)。而服務(wù)器端會(huì)獲取If-Modified-Since值,與index.html的當(dāng)前最后修改時(shí)間比對(duì),如果相同,服務(wù)器會(huì)發(fā)響應(yīng)碼304,表示index.html與瀏覽器上次緩存的相同,無(wú)需再次發(fā)送,瀏覽器可以顯示自己的緩存頁(yè)面,如果比對(duì)不同,那么說(shuō)明index.html已經(jīng)做了修改,服務(wù)器會(huì)響應(yīng)200。
響應(yīng)頭:
Last-Modified:最后的修改時(shí)間;
請(qǐng)求頭:
If-Modified-Since:把上次請(qǐng)求的index.html的最后修改時(shí)間還給服務(wù)器;
狀態(tài)碼:304,比較If-Modified-Since的時(shí)間與文件真實(shí)的時(shí)間一樣時(shí),服務(wù)器會(huì)響應(yīng)304,而且不會(huì)有響正文,表示瀏覽器緩存的就是最新版本!
其它響應(yīng)頭
告訴瀏覽器不要緩存的響應(yīng)頭:
Expires: -1;
Cache-Control: no-cache;
Pragma: no-cache;
自動(dòng)刷新響應(yīng)頭,瀏覽器會(huì)在3秒之后請(qǐng)求http://www.itcast.cn:
Refresh: 3;url=http://www.itcast.cn
HTML中指定響應(yīng)頭
在HTMl頁(yè)面中可以使用<meta http-equiv="" content="">來(lái)指定響應(yīng)頭,例如在index.html頁(yè)面中給出<meta http-equiv="Refresh" content="3;url=http://www.itcast.cn">,表示瀏覽器只會(huì)顯示index.html頁(yè)面3秒,然后自動(dòng)跳轉(zhuǎn)到http://www.itcast.cn。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)