天天看點

HTTP+Request

看問題找答案:

1.Http協定是什麼,起什麼作用?

2.request對象,誰建立誰使用?

3.request域和ServletContext域的生命周期

HTTP

  • 概念:Hyper Text Transfer Protocol 超文本傳輸協定
    • 傳輸協定:用戶端和伺服器端通信過程中時,定義發送資料的格式。如請求頭,請求體,響應頭,響應體等。
    • 特點:
      1. 基于TCP/IP的進階協定
      2. 預設端口号:80
      3. 基于請求/響應模型的:一次請求對應一次響應
      4. 無狀态的:每次請求之間互相獨立,不能互動資料
    • 曆史版本:
      • 1.0:每一次請求響應都會建立新的連接配接
      • 1.1:複用連接配接
  • 請求消息資料格式
    1. 請求行

      請求方式 請求url 請求協定/版本

      GET /login.html HTTP/1.1

      • 請求方式:
        • HTTP協定有7中請求方式,常用的有2種
          • GET:
            1. 請求參數在請求行中,在url後。
            2. 請求的url長度有限制的
            3. 不太安全
          • POST:
            1. 請求參數在請求體中
            2. 請求的url長度沒有限制的
            3. 相對安全
    2. 請求頭:用戶端浏覽器告訴伺服器一些資訊

      請求頭名稱: 請求頭值

      • 常見的請求頭:
        1. User-Agent:浏覽器告訴伺服器,我通路你使用的浏覽器版本資訊
          • 可以在伺服器端擷取該頭的資訊,解決浏覽器的相容性問題
        2. Referer:http://localhost/login.html
          • 告訴伺服器,我(目前請求)從哪裡來?
            • 作用:
              1. 防盜鍊:
              2. 統計工作:
    3. 請求空行

      空行,就是用于分割POST請求的請求頭,和請求體的。

    4. 請求體(正文):
      • 封裝POST請求消息的請求參數的
      • 字元串格式:

        POST /login.html HTTP/1.1

        Host: localhost

        User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0

        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

        Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

        Accept-Encoding: gzip, deflate

        Referer: http://localhost/login.html

        Connection: keep-alive

        Upgrade-Insecure-Requests: 1

      username=zhangsan

Request:

  1. request對象和response對象的原理
    1. request和response對象是由伺服器建立的。我們來使用它們
    2. request對象是來擷取請求消息,response對象是來設定響應消息
  2. request對象繼承體系結構:

    ServletRequest – 接口

    | 繼承

    HttpServletRequest – 接口

    | 實作

    org.apache.catalina.connector.RequestFacade 類(tomcat)

  3. request功能:
    1. 擷取請求消息資料
      1. 擷取請求行資料
        • GET /day14/demo1?name=zhangsan HTTP/1.1
        • 方法:
          1. 擷取請求方式 :GET
            • String getMethod()
          2. 擷取虛拟目錄:/day14
            • String getContextPath()
          3. 擷取Servlet路徑: /demo1
            • String getServletPath()
          4. 擷取get方式請求參數:name=zhangsan
            • String getQueryString()
          5. 擷取請求URI:/day14/demo1
            • String getRequestURI(): /day14/demo1
            • StringBuffer getRequestURL() :http://localhost/day14/demo1
            • URL:統一資源定位符 : http://localhost/day14/demo1 中華人民共和國
            • URI:統一資源辨別符 : /day14/demo1 共和國
          6. 擷取協定及版本:HTTP/1.1
            • String getProtocol()
          7. 擷取客戶機的IP位址:
            • String getRemoteAddr()
      2. 擷取請求頭資料
        • 方法:
          • String getHeader(String name):通過請求頭的名稱擷取請求頭的值
          • Enumeration getHeaderNames():擷取所有的請求頭名稱
      3. 擷取請求體資料:
        • 請求體:隻有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求參數
        • 步驟:
          1. 擷取流對象
            • BufferedReader getReader():擷取字元輸入流,隻能操作字元資料
            • ServletInputStream getInputStream():擷取位元組輸入流,可以操作所有類型資料
              • 在檔案上傳知識點後講解
          2. 再從流對象中拿資料
    2. 其他功能:
      1. 擷取請求參數通用方式:不論get還是post請求方式都可以使用下列方法來擷取請求參數
        1. String getParameter(String name):根據參數名稱擷取參數值 username=zs&password=123
        2. String[] getParameterValues(String name):根據參數名稱擷取參數值的數組 hobby=xx&hobby=game
        3. Enumeration getParameterNames():擷取所有請求的參數名稱
        4. Map<String,String[]> getParameterMap():擷取所有參數的map集合
        • 中文亂碼問題:
          • get方式:tomcat 8 已經将get方式亂碼問題解決了
          • 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. 共享資料:
        • 域對象:一個有作用範圍的對象,可以在範圍内共享資料
        • request域:代表一次請求的範圍,一般用于請求轉發的多個資源中共享資料,請求的生命周期就是該域的生命周期。
        • 方法:
          1. void setAttribute(String name,Object obj):存儲資料
          2. Object getAttitude(String name):通過鍵擷取值
          3. void removeAttribute(String name):通過鍵移除鍵值對
      4. 擷取ServletContext:全局唯一,且被所有servlet對象共享,伺服器開始就存在,伺服器關閉才釋放
        • ServletContext getServletContext()

繼續閱讀