HTTP協議總結
HTTP協議(超文字傳輸通訊協定 (HTTP))
http 是一個基於請求與響應模式的,無狀態的,應用程式層的協議,該協議基於TCP連結(三向交握),HTTP 1.1版本中給出一種持續連結的機制,絕大多數的Web開發都是構建在HTTP協議之上的。
URL 是一種特殊類型的URI(統一資源識別項),包含用於尋找某個資源的足夠資訊。
HTTP URL 格式如下:
http://host[":"port][abs_path]
host: 表示合法的internet主機網域名稱和IP地址。 port指連接埠號碼,為null則表示使用預設的連接埠80(預設值)。 abs_path:指定請求資源的URI。如果URL中沒有給出abs_path,那麼當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。
當我們輸入www.hao123.com
http://www.hao123.com/
hao123 表示網域名稱,輸入該網域名稱會在DNS伺服器中尋找該網域名稱對應的ip。
該網域名稱使用的是80連接埠,可以不需要輸入。
最後因為沒有輸入資源地址,瀏覽器會預設在其後加入/作為結束。 HTTP 協議的特點 支援用戶端/服務端模式。及瀏覽器可以和我們的伺服器通過HTTP協議進行互動。 簡單快速:客戶向服務端請求服務時,只需傳送要求方法和路徑。要求方法常有的有GET,HEAD,POST。每種方法規定了客戶與伺服器聯絡的類型。由於HTTP協議的簡單,使得HTTP協議HTTP伺服器規模小,因而通訊速度快。 靈活:HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以標記。 無狀態:對於事務的處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則必須重新傳送。另一方面,在不需要前面的資訊,處理速度較快。 無串連: 在HTTP /1.0 時,請求響應之後就斷開。HTTP/1.1 ,請求之後不會立即斷開,而是連結一段時間之後,如果沒有後續請求,才會斷開。 HTTP 協議版本
HTTP協議總共分為兩個版本,分別是HTTP/1.0和HTTP/1.1.
HTTP/1.0 連結後,只能請求一個web資源 連結後,只能做出一次響應和請求,響應完成之後伺服器會立即斷開。
HTTP/1.1 連結後,可以請求多個web資源 連結後,發送請求,伺服器做出響應,連結不會立即斷開。再次發送請求,直接有一段時間沒操作,自動斷開。 HTTP 要求
由圖中可以看出,HTTP 要求分為三部分,請求行,要求標頭,請求體。
請求行 分為三部分,
請求方式: 所有請求方式:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT、CONNECT 常用的請求方式有POST,GET。 POST和GET的區別:
POST 將參數封裝到請求體中,安全層級高,支援大資料。 GET 將參數直接顯示到地址欄中,安全層級低,不支援大資料。
請求地址: 請求的資源。 協議版本:HTTP/1.1
要求標頭
Accept: text/html,image/* Accept-Charset: ISO-8859-1 Accept-Encoding: gzip Accept-Language:zh-cn Host: www.itcast.com:80 If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT Referer: http://www.itcast.com/index.jsp User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Connection: close/Keep-Alive Date: Tue, 11 Jul 2000 18:23:51 GMT
請求體: GET為null.Post 封裝參數列表。
可以看到要求標頭重有一些欄位,該欄位都是以鍵-值對的形式出現。某些欄位是一鍵對多值。我們可以通過設定該欄位的一些值以達到一些特殊的效果。 HTTP 響應
響應和請求很類似,分為響應行,回應標頭,響應體。
其中在響應行中有200 ,該欄位標識請求響應的結果。
狀態碼有三位元字組成,第一個數字定義了響應的類別,且有五種可能取值: 1xx:指示資訊–表示請求已接收,繼續處理 2xx:成功–表示請求已被成功接收、理解、接受 3xx:重新導向–要完成請求必須進行更進一步的操作 4xx:用戶端錯誤–請求有語法錯誤或請求無法實現 5xx:伺服器端錯誤–伺服器未能實現合法的請求
常見的響應碼如下: 200 用戶端請求成功。 400 用戶端請求有語法錯誤,不能伺服器所理解。 401 請求未經授權 404 請求資源不存在 500 伺服器發生不可預知的錯誤 503 伺服器當前不能處理用戶端的請求,一段時間後可能恢複正常。
在相應頭中,類似要求標頭一樣,也是存在著一個個索引值對。可以配合要求標頭做一些事情。 HTTP 的應用 防盜鏈
在一些網站中,可以擷取別人網站的連結加入到自己的網站中,導致使用者從其他網站上瀏覽到了本站的資訊。
如圖,有兩個網站,分別為好人和壞人的網站,其中壞人盜取了好人的網站連結。即盜鏈。
而在請求中存在欄位referer頭資訊,可以通過referer判斷連結是否正確。
而在JavaWeb中,通過Servlet的request可以擷取頭資訊。
//通過referer 和自己的網址進行對比 String referer = request.getHeader("Referer");
擷取瀏覽器資訊
通過要求標頭的user-agent擷取瀏覽器資訊。
// 防止中文亂碼 response.setContentType("text/html;charset=UTF-8"); // 擷取瀏覽器資訊 String s = request.getHeader("user-agent"); response.getWriter().write(s);
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
擷取到瀏覽器資訊,系統資訊。 通過該欄位可以區分訪問時來自pc端還是移動端。 頁面的定時重新整理
通過回應標頭欄位refresh實現頁面定時重新整理。
response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("訪問到了..."); // 頁面5秒會跳轉 response.setHeader("refresh", "5;url=http://www.baidu.com");
頁面會在5秒之後跳轉到百度。 實現重新導向
轉寄和重新導向的區別 轉寄:找班長借錢,他自己找富班長借錢。(兩個頁面拼接到一起,後台悄悄處理) 重新導向:找班長借錢,發送一次請求,回了我沒錢,返回狀態代碼302,給副班長地址,再去找富班長借錢,又發送了一次。
重新導向的實現
response.setContentType("text/html;charset=UTF-8"); // response.getWriter().write("向班長借錢..."); // 我沒錢 response.setStatus(302); // 告訴我富班長的地址 response.setHeader("location", "副班長地址");