1. 程式人生 > >Java Web之HTTP協議總結

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中,通過Servletrequest可以獲取頭資訊。

    //通過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", "副班長地址");