Java Web之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", "副班長地址");