天天看點

學習筆記---HTTP協定

  • 定義:(Hyper Test Transfer Protocol) 超文本傳輸協定
  • 傳輸協定:定義了用戶端和伺服器端通信時發送資料的格式。
  • 曆史版本:
    • 版本1.0:每次請求響應都會建立新的連接配接。
    • 版本1.1:複用連接配接。
  • 特點:
    • 基于TCP/IP的進階協定;
    • 預設端口号:80;
    • 基于請求/響應模型,即一次請求對應一次響應;
    • 無狀态的:每次請求之間互相獨立,不能互動資料。
  • HTTP請求消息資料格式:
  1. 請求行:請求方式 url 協定/版本,例:GET /login.html HTTP/1.1
    1. 請求方式:
      1. GET:
        1. 請求參數在請求行中,在url後面。
        2. 請求的url長度有限
        3. 不太安全
      2. POST:
        1. 請求參數在請求體中
        2. 請求的url長度沒有限制
        3. 相對安全
  2. 請求頭:請求頭名稱:請求頭值(鍵值對格式)
    1. Host:請求的主機
    2. User-Agent:浏覽器的版本資訊,伺服器端擷取該資訊後可以解決浏覽器相容問題。
    3. Referer:告訴伺服器目前請求從哪裡來,作用1,防止盜取連結。作用2,統計工作。
  3. 請求空行:空行,用來分隔請求頭與請求體
  4. 請求體(正文):封裝POST請求消息的請求參數(POST請求有,GET請求沒有)

Request:用戶端發送給伺服器的消息

  1. request對象和response對象原理
    1. request和response對象是由伺服器建立。
    2. request對象是來擷取請求消息,response對象是來設定響應消息。
  2. request對象繼承體系結構:
    1. ServletRequest---接口
    2. HttpServletRequest---接口(繼承ServletRequest接口)
    3. org.apache.catalina.connector.TequestFacde---實作類
  3. request功能:擷取請求消息
    1. 擷取請求消息資料
      1. 擷取請求行資料(例:GET /king/test?nema=zhangsan HTTP/1.1)
        1. 擷取請求方法:String getMethod(),GET
        2. 擷取虛拟目錄:String getContextPath(),/king
        3. 擷取Servlet路徑:String getServletPath(),/test
        4. 擷取get方法請求參數:String getQueryString(),nema=zhangsan
        5. 擷取請求URI(統一資源辨別符):String getRequestURI(),/king/test
        6. 擷取請求URL(統一資源定位符):String getRequestURL(),http://localhost/king/test
        7. 擷取協定及版本:String getProtocol(),HTTP/1.1
        8. 擷取客戶機的IP位址:String getRemoteAddr()
      2. 擷取請求頭資料
        1. String getHeader(String name):根據請求頭的名稱擷取請求頭的值。
        2. Enumeration<String> getHeaderNames():擷取所有請求頭名稱。
      3. 擷取請求體資料(POST方法才有)
        1. 擷取流對象
          1. BufferReader getReader():擷取字元輸入流,隻能操作字元資料。
          2. ServletInputStream getInputStream():擷取位元組輸入流,可以操作所有類型資料。
        2. 從流對象中取資料
    2. 其他功能:
      1. 擷取請求參數通用方式
        1. String getParameter(String name):根據參數名稱擷取參數值
        2. Sting[] getParameterValues(String name):根據參數名稱擷取參數值的數組(多用于複選框情況)
        3. Enumeration<String> getParameterNames():擷取所有請求的參數名稱
        4. Map<String,String[]> getParameterMap():擷取所有參數的map集合
        5. 注意中文亂碼問題:
          1. get方式:tomcat8已将get方式亂碼問題解決
          2. post方式:需要在擷取參數前,設定request編碼方式request.setCharacterEncoding("utf-8");
      2. 請求轉發:一種在伺服器内部資源跳轉的方式。
        1. 轉發步驟:
          1. 通過request對象擷取請求轉發器對象RequestDispatcher getRequestDispatcher(string path)
          2. 使用RequestDispatcher對象進行轉發forward(ServletRequest request, ServletResponse response)
        2. 特點:
          1. 浏覽器位址欄路徑不發生變化。
          2. 隻能轉發到目前伺服器内部資源中。
          3. 轉發是一次請求。
      3. 共享資料
        1. 域對象:一個有作用範圍的對象,可以在範圍内共享資料。
        2. request域代表一次請求的範圍,一般用于請求轉發的多個資源中共享資料。
        3. 方法:
          1. void setAttribute(String name, Object obj) 存儲資料
          2. Object getAttribute(String name) 通過鍵擷取值
          3. void removeAttribute(String name) 通過鍵删除鍵值對
      4. 擷取ServletContext

Response:伺服器端發送給用戶端的消息

資料格式:

    1.響應行:HTTP/1.1 200 OK

        1.組成:協定/版本 響應狀态碼 狀态碼描述

        2.響應的狀态碼:伺服器告訴用戶端浏覽器這次請求響應的一個狀态。

            1.狀态碼都是三位數字;

            2.分類:

                1.1XX:伺服器接收用戶端的消息,但是還沒有接收完成,等待一段時候後,伺服器向浏覽器發送一個1XX的狀态碼。

                2.2XX:成功

                3.3XX:重定向,

                    典型代表:

                        302:重定向

                        304:通路緩存

                4.4XX:用戶端錯誤。

                    典型代表:

                        404:表示請求路徑沒有對應的資源

                        405:表示請求方式沒有對應的方法

                5.5XX:伺服器端錯誤。

                    典型代表:

                        500:伺服器内部出現異常;502 Bad Gateway是指錯誤網關,無效網關

    2.響應頭

        格式:鍵值對(名稱:值)

        常見的響應頭:

            1.Content-Type:伺服器告訴用戶端本次響應體資料格式以及編碼格式。

            2.Content-disposition:伺服器告訴用戶端以什麼格式打開響應體資料。

                in-line:預設值,在目前頁面内打開。

                attachment:以附件形式打開,如檔案下載下傳。    

    3.響應空行

    4.響應體:傳輸的資料。

Response對象:

    功能:設定響應消息。

        1.設定響應行;

            1.格式:HTTP/1.1 200 OK

            2.設定狀态碼;setStatus(int sc)

        2.設定響應頭:setHeader(String name, String value)

        3.設定響應體:

            使用步驟:

                1.擷取輸出流;

                    *字元輸出流:PrintWriter getWriter()

                    *位元組輸出流:ServletOutPutStream getOutPutStream()

                2.使用輸出流,将資料輸出到用戶端浏覽器中。

案例:

    1.重定向:資源跳轉的方式

        實作:response.sendRedirect("目标url")

        重定向的特點:redirect

            1.位址欄路徑發生改變

            2.重定向可以通路其他伺服器的資源

            3.重定向是兩次請求。不能使用request對象來共享資料了

        轉發的特點:forward

            1.轉發位址欄路徑不變

            2.轉發隻能通路目前伺服器下的資源

            3.轉發是一次請求

        注:面試中常問到redirect和forward的差別

        路徑的寫法:

            路徑分類:

                1.相對路徑:通過相對路徑不可以确定唯一資源

                    * 如:./index.xml

                    * 不以/開頭的,以.開頭的路徑 

                    * 規則:判斷目前資源和目标資源的相對位置關系。

                        ./:代表目前路徑

                        ../:代表後退一級目錄

                2.絕對路徑:通過絕對路徑可以确定唯一資源。

                    * 如:http://localhost/servlet/demo1  /servlet/demo1  

                    * 以/開頭的為絕對路徑

                    * 規則:判斷定義的路徑是給誰用的?判斷請求将來從哪發出

                        1.給用戶端浏覽器使用:需要加虛拟目錄(項目的通路路徑)

                            重定向

                            建議虛拟目錄動态擷取,動态擷取虛拟目錄: String contextPath = request.getContextPath();

                        2.給伺服器使用:不需要加虛拟目錄

                            轉發

    2.伺服器輸出字元資料到浏覽器

        步驟:

            1.擷取字元輸出流:

                PrintWriter pw = response.getWriter();

            2.輸出資料

                pw.write("hello");

            注:可能存在中文亂碼問題,如果出現亂碼,那麼一定是編解碼使用的字元集不一緻導緻

            解決方法:在擷取流對象之前設定流編碼,預設為ISO-8899-1

            -1.設定流編碼

                response.setCharacterEncoding("GBK");//想要的編碼格式,這裡僅作舉例。

            0.告訴浏覽器使用特定的編碼格式

                response.setHeader("content-type","text/html;charset=utf-8");

            -1和0可以簡寫為:response.setContentType("text/html;charset=utf-8");

    3.伺服器輸出位元組資料到浏覽器

        步驟:

            1.擷取位元組輸出流

                ServletOutPutStream sos = response.getOutPutStream();

            2.輸出資料

                sos.write("hello".getBytes());

        注:同樣會出現中文亂碼問題,解決方法同上。

    4.驗證碼

        1.本質:圖檔

        2.目的:防止惡意表單注冊