----------------------http協議-----------------------------
1. HTTP協議
1 什麼是HTTP協議
HTTP,即超文本傳輸協議。所有瀏覽器都可以發出http協議。
協議:就是規定的文本格式!例如寫本書也要有格式,寫總結也有格式。當然客戶端發送請求也要有格式,這個格式是已經約定的格式,所以服務器端按請求格式來獲取請求信息,然後服務器端再按照響應格式來響應,當然客戶端還要按響應的格式來解析。
2 無狀態協議
HTTP是無狀態協議,必須必須理解這一點!!!
所謂無狀態,就是客戶端發送一個請求,服務器返回一個響應,然後就斷開連接了。
無狀態協議的好處,當然是效率高了,用戶連接一下就斷開,當用戶再次發送請求時,再連接,然後在響應之後再次斷開。如果用戶在服務器上找到了自己想看的小說,那麼服務器只是把小說的內容(html)發送給用戶的瀏覽器,然後用戶的瀏覽器顯示已經發送到本地的html,其實這時已經與服務器斷開連接了。用戶可能會看很久,但這不會佔用服務器的任何資源!
3.HTTP1.0和HTTP1.1
HTTP現在有兩個版本,HTTP1.0和HTTP1.1。
HTTP1.0:響應結束後會馬上斷開;
HTTP1.1:必須在請求中包含Host(主機)頭信息,響應結束後不會馬上斷開,會有一個超時時間,可能會在超時之前完成多個請求/響應,當超時的時候就斷開。
GET /web_demo/index.jsp HTTP/1.0
Host: localhost:8080
GET /hello/index.jsp HTTP/1.0
Host: localhost:8080
開啓telnet功能第一種方式
開啓telnet功能第二種方式
響應http1.0請求方式:
1.在dos命令窗口輸入telnet localhost 端口號
2.然後複製
GET /hello/index.jsp HTTP/1.0
Host: localhost:8080
按回車
200代表請求成功
結果會發現http1.0在請求完之後會立馬斷開連接
響應http1.1請求方式:
輸入以下命令
GET /hello/index.jsp HTTP/1.1
Host: localhost:8080
會發現http1.1在請求完之後並馬上不會斷開連接
4 請求協議和響應協議
無論是請求協議還是響應協議,都是由如下部分構成的:
l 請求(或響應)首行;
l 請求(或響應)頭信息;
l 空行;
l 請求(或響應)正文。
5. 請求協議
我們可以通過瀏覽器來監視請求和響應,獲取完整的請求和響應信息。
l Fire Fox:
l Google:內置了這功能,也無需安裝。
請求
GET/hello/index.jsp HTTP/1.1
響應
Request URL = 請求網址 Request Method = 請求方法 Status Code = 狀態碼 Remote Address = 遠程地址 [: : 1]代表本地 請求頭: Host = 主機地址,請求的消息頭 User-Agent = 包括瀏覽器、操作系統等信息 Accept = 請求或接收的格式 Accept-Language = 接收的語言 Accept-Encoding = 接收的編碼 Connection = 連接狀態 Cache-Control = 緩存管理 響應頭: Content-Length = 內容的長度 Content-Type = 內容的類型 Date = 日期 Server = 服務器版本 |
1. GET請求
下面是通過FireFox獲取到的請求信息,這就是瀏覽器發送給服務器的全部請求信息內容。請求的地址是:http://localhost/hello/index.jsp
//請求首行 GET /hello/index.jsp HTTP/1.1 //下面全部是請求頭信息,因爲GET請求沒有正文 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 //空行,因爲GET沒有正文,所以下面沒有東西了 |
l GET /hello/index.jsp HTTP/1.1:GET請求,請求服務器路徑爲/hello/index.jsp,協議爲1.1;
l Host:localhost:請求的主機名爲localhost;
l User-Agent: Mozilla/5.0 (WindowsNT 5.1; rv:5.0) Gecko/20100101Firefox/5.0:與瀏覽器和OS相關的信息。有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是通過獲取User-Agent頭信息而來的;
l Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8:告訴服務器,當前客戶端可以接收的文檔類型,其實這裏包含了*/*,就表示什麼都可以接收;
l Accept-Language: zh-cn,zh;q=0.5:當前客戶端支持的語言,可以在瀏覽器的工具à選項中找到語言相關信息;
l Accept-Encoding: gzip, deflate:支持的壓縮格式。數據在網絡上傳遞時,可能服務器會把數據壓縮後再發送;
l Connection: keep-alive:客戶端支持的鏈接方式,保持一段時間鏈接,默認爲3000ms;
l Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:因爲不是第一次訪問這個地址,所以會在請求中把上一次服務器響應中發送過來的Cookie在請求中一併發送去過;這個Cookie的名字爲JSESSIONID,然後在講會話是講究它!
Get請求沒有正文,只有頭信息,請求參數是在請求的首行的url中傳遞的。請求的參數的容量是有限的,不能超過1024kb,(一般通過地址欄或者超鏈接訪問)
2 POST請求
下面是通過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 |
l Content-Type: application/x-www-form-urlencoded:表單的數據類型,說明會使用url格式的UTF-8編碼數據;url編碼的數據都是以“%”爲前綴,後面跟隨兩位的16進制;I Referer: http://localhost/hello/index.jsp:請求來自哪個頁面。這個值說明請求是從index.jsp頁面發送出去的!這個東東還是比較有用的!
如果這個表單的作用是下載,那麼在給用戶提供資源之前可以去判斷請求是從哪個頁面發送過來的,如果不是從本網站發送過來的,那麼就可以拒絕下載,例如盜鏈!
l Content-Length:14:表示請求數據的長度,這裏表示14個字節。
l username=hello:這是請求正文!hello是在表單中輸入的數據,username是文本框的名字。
6.響應協議
1 響應信息
// 響應首行 HTTP/1.1 200 OK // 響應頭信息 Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Content-Length: 777 Date: Sat, 09 Feb 2012 18:30:52 GMT // 空行,下面是響應正文,即HTML代碼 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="http://localhost:80/hello/"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> <form method="post" action="index.jsp"> <input type="text" name="username" /><br/> <input type="submit" value="SUBMIT"/> </form> </body> </html> |
I HTTP/1.1 200 OK:響應協議爲HTTP1.1,狀態碼爲200,表示請求成功,OK是對狀態碼的解釋;
I Server: Apache-Coyote/1.1:這是服務器的版本信息;
I Content-Type: text/html;charset=UTF-8:請求正文使用的編碼爲UTF-8;l Content-Length: 777:響應的內容爲777字節;
l Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:響應給客戶端的Cookie;
l Date: Sat, 09 Feb 2012 18:30:52 GMT:響應的時間,這可能會有8小時的時區差;
常見狀態碼:
l 404 not found:沒有找到;
l 500 error:找到了,但內部出錯;
l 200 ok:成功!
請求:GET/POST
只有表單纔可能是POST,其他都是GET
POST有正文,即表單內容:username=zhangSan&password=123
GET沒有正文,但是空行可是有的!
請求首行
(GET/POST) URL HTTP/1.1
響應首行
HTTP/1.1 狀態碼 狀態碼的解釋
響應的正文就是HTML!
Post請求:有正文,而且正文內容不受限制,通過表單的方式提交(除了表單方式的提交時post請求方式,其餘的都是get請求)。