Http協議詳解
來源:程序員人生 發布時間:2014-10-02 08:00:00 閱讀次數:2988次
HTTP協議即超文本傳輸協議,這個協議詳細規定了瀏覽器和萬維網之間互相通信的規則。HTTP協議就是一個通信的規則,通信規則規定了客戶端發送給服務器的內容格式,也規定了服務器發送給客戶端的內容格式。其實我們要學的就是這兩種格式。客戶端發送給服務器的格式叫做請求協議,服務器發送給客戶端的叫做響應協議。
一、請求協議
請求協議的格式如下:
瀏覽器發送給服務器的內容就是這個格式的。如果不是這個格式,服務器不會解讀。在HTTP協議中,請求有很多方法,其中最常見的就是post和get方法。不同的方法會有所區別。我們可以通過HttpWatch觀察到瀏覽器與服務器之間的請求信息和響應欣喜的格式。
GET請求
在myeclipse中創建一個web工程,在地址欄中輸入訪問地址:http://127.0.0.1:8080/HttpDemo/index.jsp之后,我們可以在Chrome中查看瀏覽器向服務器發送的get請求,請求的格式如下所示:
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請求,請求的路徑為 /HttpDemo/index.jsp?userName=min&password=lingchao,協議及版本為:HTTP/1.1
- Host: 127.0.0.1:8080:請求的主機名為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:與瀏覽器和操作系統有關的信息,有些網站會顯示用戶的系統版本和瀏覽器的版本信息,這都是通過獲取該頭部得到的。
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8:告訴服務器當前客戶端可以接收的文檔的類型。其實這里包含了*/*,就表示什么都可以接收;
- Accept-Language: zh-CN,zh;q=0.8:當前客戶端可以支持的語言,在瀏覽器的工具->選項中可以得到相關信息
- Accept-Encoding: gzip,deflate,sdch:客戶端支持的編碼
- Connection: keep-alive:客戶端支持的連接方式,保持一段連接,默認為3000ms
- Cookie: JSESSIONID=57C3302F3350676F65B5E4409ABA87CF:因為不是第一次訪問這個地址,所以在請求上會把上一次服務器響應中發送過來的Cookie在請求中一并發送過去。
POST請求
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請求時可以有體的,而GET請求不能有請求體。
- Referer: http://127.0.0.1:8080/HttpDemo/index.jsp:請求來自哪個頁面,例如在百度上點擊鏈接到了這里,那么Referer:http://www.baidu.com;如果你是在瀏覽器的地址欄里輸入,那么久沒有這個Referer請求頭了
- Content-Type: application/x-www-form-urlencoded:表單的數據類型,說明會使用url編碼。url編碼的數據都是以“%”為前綴,后面跟隨兩位的16進制
- Content-Length: 28:請求體的長度,這里表示28個字節
- userName=min&password=111217:請求題內容,hello是在表單中輸入的數據。userName,password是表單字段的名字,=后面是輸入的數據,多個字段中間使用&連接
Referer請求頭是比較有用的一個請求頭,它可以用來做統計工作,也可以用來做防盜鏈。
統計工作:我公司網站在百度上做了廣告,但不知道在百度上做廣告對我們網站的訪問量是否有影響,那么可以對每個請求中的Referer進行分析,如果Referer為百度的很多,那么說明用戶都是通過百度找到我們公司網站的。
防盜鏈:我公司網站上有一個下載鏈接,而其他網站盜鏈了這個地址,例如在我網站上的index.html頁面中有一個鏈接,點擊即可下載JDK7.0,但有某個人的微博中盜鏈了這個資源,它也有一個鏈接指向我們網站的JDK7.0,也就是說登錄它的微博,點擊鏈接就可以從我網站上下載JDK7.0,這導致我們網站的廣告沒有看,但下載的卻是我網站的資源。這時可以使用Referer進行防盜鏈,在資源被下載之前,我們對Referer進行判斷,如果請求來自本網站,那么允許下載,如果非本網站,先跳轉到本網站看廣告,然后再允許下載。
二、響應協議
響應內容是由服務器發送給瀏覽器的內容,瀏覽器會根據響應內容來顯示。
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:響應協議為HTTP1.1,狀態碼為200,表示請求成功,OK是對狀態碼的解釋;
Server: Apache-Coyote/1.1:服務器的版本信息;
Content-Type: text/html;charset=UTF-8:響應體使用的編碼為UTF-8;
Content-Length: 724:響應體為724字節;
Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:響應給客戶端的Cookie;
Date: Wed, 25 Sep 2012 04:15:03 GMT:響應的時間,這可能會有8小時的時區差;
GET和POST的區別
- get是從服務器上獲取數據而post是向服務器傳送數據
- get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中。值和表單中相應的字段一一對應,在URL中可以看到。post是通過HTTP 的post機制,將表單中各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程
- 對于get方式,服務器端用requestQueryString獲取變量的值。對于post方式服務器用Request.form獲取提交數據
- get傳輸的數據量較小,不能大于2kb,post傳輸的數據量比較大,一般默認為不受限制。但是理論上,IIS4中最大量為80kb,IIS5中最大量為100kb
- get安全性非常低,post安全性較高。但是執行效率卻比post方法好。
響應碼
響應碼對于瀏覽器來說,很重要,它說明了響應的真正含義。例如200表示請求成功,302表示重定向,這說明瀏覽器需要再發送一個新的請求。
- 200:請求成功,瀏覽器會把響應體的內容(通常是html顯示在瀏覽器中
- 404:請求的資源沒找到,說明客戶端錯誤的請求了不存在的資源。
- 500:請求的資源找到了,但是服務器內部出現了錯誤
- 302:重定向,當響應碼為302時,表示服務器要求瀏覽器重新發送一個請求,服務器會發送一個響應頭Location,它指定了請求的URL地址
- 304:當用戶第一次請求index.html時,服務器會添加一個名字為Last-Modified響應頭,這個響應頭說明了index.html的最后修改時間,瀏覽器會把index.html內容,以及最后響應時間緩存下來。當用戶第二次請求index.html時,在請求中包含一個名為if-Modified-Since請求頭,它的值就是第一次請求時服務器通過Last-Modified響應頭發給瀏覽器的值,即index.htmI最后的修改時間,If-Modified-Since請求頭就是在告訴服務器,我這里瀏覽器緩存的index.html最后修改時間是這個,您看看現在的index.html最后修改時間是不是這個,如果還是,那么您就不用再響應這個index.html內容了,我會把緩存的內容直接顯示出來。而服務器端會獲取If-Modified-Since值,與index.html的當前最后修改時間比對,如果相同,服務器會發響應碼304,表示index.html與瀏覽器上次緩存的相同,無需再次發送,瀏覽器可以顯示自己的緩存頁面,如果比對不同,那么說明index.html已經做了修改,服務器會響應200。
響應頭:
Last-Modified:最后的修改時間;
請求頭:
If-Modified-Since:把上次請求的index.html的最后修改時間還給服務器;
狀態碼:304,比較If-Modified-Since的時間與文件真實的時間一樣時,服務器會響應304,而且不會有響正文,表示瀏覽器緩存的就是最新版本!
其它響應頭
告訴瀏覽器不要緩存的響應頭:
Expires: -1;
Cache-Control: no-cache;
Pragma: no-cache;
自動刷新響應頭,瀏覽器會在3秒之后請求http://www.itcast.cn:
Refresh: 3;url=http://www.itcast.cn
HTML中指定響應頭
在HTMl頁面中可以使用<meta http-equiv="" content="">來指定響應頭,例如在index.html頁面中給出<meta http-equiv="Refresh" content="3;url=http://www.itcast.cn">,表示瀏覽器只會顯示index.html頁面3秒,然后自動跳轉到http://www.itcast.cn。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈