Java-Web HTTP协议
一、HTTP概述
????????HTTP(hypertext transport protocol),即超文本傳輸協議。這個協議詳細規定了瀏覽器和萬維網服務器之間互相通信的規則。
????????HTTP就是一個通信規則,通信規則規定了客戶端發送給服務器的內容格式,也規定了服務器發送給客戶端的內容格式??蛻舳税l送給服務器的格式叫“請求協議”;服務器發送給客戶端的格式叫“響應協議”。
二、請求協議
????格式:
????????????????????請求首行;
????????????????????請求頭信息;
????????????????????空行;
????????????????????請求體。
????????瀏覽器發送給服務器的內容就這個格式的,如果不是這個格式服務器將無法解讀!在HTTP協議中,請求有很多請求方法,其中最為常用的就是GET和POST。
? ? 1.GET請求
GET /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 Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98GET /hello/index.jsp HTTP/1.1:GET請求,請求服務器路徑為/hello/index.jsp,協議為1.1;
Host:localhost:請求的主機名為localhost;
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:與瀏覽器和OS相關的信息。有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是通過獲取User-Agent頭信息而來的;
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:客戶端支持的鏈接方式,保持一段時間鏈接,默認為3000ms;
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:因為不是第一次訪問這個地址,所以會在請求中把上一次服務器響應中發送過來的Cookie在請求中一并發送去過;這個Cookie的名字為JSESSIONID。
? ? 2.POST請求
<form action="" method="post">關鍵字:<input type="text" name="keyword"/><input type="submit" value="提交"/> </form> POST /hello/index.jsp HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: http://localhost:8080/hello/index.jsp Accept-Language: zh-cn,en-US;q=0.5 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: localhost:8080 Content-Length: 13 Connection: Keep-Alive Cache-Control: no-cache Cookie: JSESSIONID=E365D980343B9307023A1D271CC48E7D [請求頭,下面是空行] keyword=hello[請求體,上面是空行。]POST請求是可以有體的,而GET請求不能有請求體。
Referer: http://localhost:8080/hello/index.jsp:請求來自哪個頁面,例如你在百度上點擊鏈接到了這里,那么請求頭為Referer:http://www.baidu.com;如果你是在瀏覽器的地址欄中直接輸入的地址,那么就沒有Referer這個請求頭了;
Content-Type: application/x-www-form-urlencoded:表單的數據類型,說明會使用url格式編碼數據;url編碼的數據都是以“%”為前綴,后面跟隨兩位的16進制,例如“傳智”這兩個字使用UTF-8的url編碼用為“%E4%BC%A0%E6%99%BA”;
Content-Length:13:請求體的長度,這里表示13個字節。
keyword=hello:請求體內容!hello是在表單中輸入的數據,keyword是表單字段的名字。
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: 724 Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello Date: Wed, 25 Sep 2012 04:15:03 GMT [響應頭][空行] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href="http://localhost:8080/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> <form action="" method="post">關鍵字:<input type="text" name="keyword"/><input type="submit" value="提交"/> </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小時的時區差;
四、狀態碼
百度百科:HTTP狀態碼
?????HTTP狀態碼(HTTP Status Code)是用以表示網頁服務器HTTP響應狀態的3位數字代碼。
????????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.html最后的修改時間,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,而且不會有響正文,表示瀏覽器緩存的就是最新版本!
五、HTML中指定響應頭
????????在HTMl頁面中可以使用<meta http-equiv="" content="">來指定響應頭,例如在index.html頁面中給出<meta http-equiv="Refresh" content="3;url=http://www.baidu.com">,表示瀏覽器只會顯示index.html頁面3秒,然后自動跳轉到http://www.baidu.com。
總結
以上是生活随笔為你收集整理的Java-Web HTTP协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyEclipse创建JavaWeb应用
- 下一篇: java美元兑换,(Java实现) 美元