2020年HTTP課堂筆記

HTTP

HTTP協議

本節用到的結構:
在這裏插入圖片描述

概念:超文本傳輸協議

傳輸定義:定義了客戶端服務器端通信時,發送數據的格式

特點:

  1. 基於TCP/IP的高級協議(三次握手,安全)
  2. 默認端口號:80
  3. 基於請求/響應模型:一次請求對應一次響應
  4. 無狀態:每次請求之間相互獨立,不能交互數據

版本不同:

  • 1.0版本:每一次請求建立新的連接
  • 1.1版本:複用連接

HTTP協議內容:

請求消息:客戶端發送給服務器端的數據
  1. 請求行
  • 格式:請求方式 請求url 請求協議/版本

    例子: GET login.html HTTP/1.1

  • HTTP協議中常用的2種請求方式:

    GET

    1. 請求參數在請求行中,在url後
    2. 請求的url長度有限度
    3. 不太安全

    POST

    1. 請求參數在請求體
    2. 請求的url長度沒有限制的
    3. 相對安全
  1. 請求頭:客戶端瀏覽器向服務器端傳輸一些信息
  • 請求頭名稱:請求頭值

    常用的2種請求頭:

    1. User-Agent:返回服務器端,該瀏覽器的版本信息

    2. Referer:url路徑:告訴服務器請求來源

      作用:防盜鏈,統計工作。

  1. 請求空行:空行,用於分割請求頭,和請求體

注意:post請求方式纔有請求體

  1. 請求體(正文):封裝POST請求消息的請求參數

請求消息數據格式實力字符串

響應消息:服務器端發送給客戶端的數據
  1. 響應行

    組成:協議/版本 響應狀態碼 狀態碼描述

    響應狀態碼:服務器告訴客戶端瀏覽器本次請求和響應的一個狀態。

  • 狀態碼分類:
狀態碼 含義 代表
1xx 服務器接收客戶端消息,但沒有接收完成,等待一段時間
2xx 成功 200(成功)
3xx 成功,重定向 302(重定向),304(訪問緩存)
4xx 失敗,客戶端錯誤 404(請求資源路徑錯誤),405(請求方式沒有對應的doXxx方法)
5xx 失敗,服務器錯誤 500(服務器的內部異常)
  1. 響應頭

格式:頭名稱:值

常見的響應頭:

  1. Content-Type:服務器告訴客戶端本次響應體數據格式以及編碼格式

  2. Content-disposition:服務器告訴客戶端以什麼格式打開響應體數據

    參數值:

    • in-line:默認值,在當前頁面內打開
    • attachment;filename=xxx:以附件形式打開響應體。文件下載
  3. 響應空行

  4. 響應體

Request

request對象和response對象的原理

request對象和response對象是由服務器創建的。

  • request對象用於請求消息
  • response對象用於設置響應消息

request對象繼承體系結構

ServletRequest —— 接口

​ | 繼承

HttpServletRequest

​ | 實現

RequestFacade類(Tomcat)

request功能

獲取請求消息數據

  1. 獲取請求行數據

    方法聲明 功能描述
    String getMethod() 獲取請求方式
    String getContextPath() 獲取虛擬目錄
    String getServletPath() 獲取Servlet路徑
    String getQueryString() 獲取get方式請求參數
    String getRequestURL() 獲取請求URL,URL相對路徑
    StringBuffer getRequestURL() 獲取請求URL,URL絕對路徑
    String getProtocol() 獲取協議及版本:HTTP/1.1
    String getRemoteAddr() 獲取客戶機的IP地址
  2. 獲取請求頭數據

    方法聲明 功能描述
    String getHeader(String name) 通過請求頭的名稱獲取請求頭的值
    Enumeration getHeaderNames() 獲取所有的請求頭名稱
  3. 獲取請求體數據

    注意:只有POST請求方式纔有請求體

    1. 獲取流對象
    方法聲明 功能描述
    BufferedReader getReader() 獲取字符輸入流,只能操作字符數據
    ServletInputStream getInputStream() 獲取字節輸入流,可以操作所有類型數據
    1. 再從流對象中拿數據
  4. 其他功能

    獲取請求參數通用方式

    方法聲明 功能描述
    String getParameter(String name) 根據參數名稱獲取參數值
    String[] getParameterValues(String name) 根據參數名稱獲取參數值的數組
    Enumeration getParameterNames() 獲取所有請求的參數名稱
    Map<String,String[]> getParameterMap() 獲取所有參數的map集合

    中文亂碼問題:

    1. get方式:Tomcat 8 已經將get方式亂碼問題解決了
    2. post方式:會亂碼
      解決:在獲取參數前,設置request的編碼request.setCharacterEncoding("utf-8")

請求轉發:一種在服務器內部的資源跳轉方式

  1. 步驟:

    1. 通過request對象獲取請求轉換器對象:

      RequestDispatcher getRequestDispatcher(String path)

    2. 使用RequestDispatcher對象來進行轉發:

      forward(ServletRequest request,ServletResponse response)

  2. 特點:

    • 瀏覽器地址欄路徑不發生變化
    • 只能轉發到當前服務器內部資源中
    • 轉發是一次請求

共享數據

  • 域對象:一個有作用範圍的對象,可以在範圍內共享數據

  • request域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享數據

  • 常用方法:

    方法聲明 功能描述
    void setAttribute(String name,Object obj) 存儲數據
    Object getAttitude(String name) 通過鍵獲取值
    void removeAttribute(String name) 通過鍵移除值對
  • 獲取ServletContextServletContext getServletContext()

Response

Response對象

功能:設置響應消息

  1. 設置響應行

    格式:協議/版本 響應狀態碼 狀態碼描述(HTTP/1.1 200 ok)

    設置響應頭:setStatus(int sc)

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

  3. 設置響應體(使用步驟):

    1. 獲取輸出流

      字符輸出流:PrintWriter getWriter()

      字節輸出流:ServletOutputStream getOutputStream()

    2. 使用輸出流,將數據輸出到客戶端瀏覽器

使用案例

完成重定向

重定向:資源跳轉的方式

重定向(redirect)的特點:

  1. 地址欄發生變化
  2. 重定向可以訪問其他站點(服務器)的資源
  3. 重定向是兩次請求(服務器1響應302跳轉到服務器2,服務器2響應200),不能使用request對象共享數據

轉發(forward)的特點:

  1. 轉發地址欄路徑不變
  2. 轉發只能訪問當前服務器下的資源
  3. 轉發是一次請求,可以使用request對象共享數據

路徑寫法

  1. 路徑分類:

相對路徑:通過相對路徑不可以確定唯一資源

規則:找到當前資源和目標資源之間的相對位置

  • ./:當前目錄
  • ../:後退一級目錄

絕對路徑:通過絕對路徑可以確定唯一資源

  1. 規則:判斷定義的路徑給誰用的?
  • 客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)
    • 動態獲取虛擬目錄:request.getContextPath()
    • 如:<a><form>、重定向……
  • 服務器使用:不需要加虛擬目錄
    • 如:轉發路徑

服務器輸出字符數據到瀏覽器

步驟:

  1. 獲取字符輸出流
  2. 輸出數據

解決亂碼問題:

  1. PrintWriter pw = response.getWriter()
  2. 設置該流的默認編碼
  3. 告訴瀏覽器響應體使用的編碼,在獲取流之前設置編碼如:response.setContentType("text/html;charset=utf-8");

服務器輸出字節數據到瀏覽器

實現步驟:

  1. 獲取字節輸出流
  2. 輸出數據

驗證碼的作用:

  1. 本質:圖片
  2. 目的:防止惡意表單註冊

ServletContext對象

概念:代表整個web應用,可以和程序的容器(服務器)來通信

獲取:

  1. 通過request對象獲取:request.getServletContext();
  2. 通過HttpServlet獲取:this.getServletContext();

注意:兩種獲取方法只有一個ServletContext對象

功能:

  1. 獲取MIME類型:

    • MIME類型:在互聯網通信過程中定義的一種文件數據類型
      格式: 大類型/小類型 text/html
    • 獲取:String getMimeType(String file)
  2. 域對象:共享數據

    1. setAttribute(String name,Object value)
    2. getAttribute(String name)
    3. removeAttribute(String name)

    ServletContext對象範圍:所有用戶所有請求的數據

  3. 獲取文件的真實(服務器)路徑:String getRealPath(String path)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章