1. 程式人生 > >http請求HttpServletRequest詳解

http請求HttpServletRequest詳解

目錄

1.  HttpServletRequest概述

2.  request的執行流程 

3. 抓包獲取的http請求資訊

4. 通過requestd物件獲得 "請求行"

5. 通過request 獲得請求頭

6. 通過request 獲得請求體

附加  request 的其他功能:

      1. request 是一個域物件 

       2. request 完成請求轉發  

        3. ServletContext域與Request域的生命週期比較?

        4. 轉發與重定向的區別?

        5. 客戶端地址與伺服器端的地址的寫法?


1.  HttpServletRequest概述

        我們在建立Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個引數,一個為代表請求的request和代表響應response。 service方法中的request的型別是ServletRequest,而doGet/doPost方法的request的型別是HttpServletRequest,HttpServletRequest是ServletRequest的子介面.

2.  request的執行流程 

3. 抓包獲取的http請求資訊

    request代表請求, 可以通過該物件分別獲取http請求的請求行,  請求頭,   請求體

4. 通過requestd物件獲得 "請求行"

    獲得請求的資源:
    String getRequestURI() 
    StringBuffer getRequestURL() 
    String getContextPath() ---web應用的名稱
    String getQueryString() ---- get提交url地址後的引數字串
    username=zhangsan&password=123

     注:request獲得客戶機(客戶端)的一些資訊         request.getRemoteAddr() --- 獲得訪問的客戶端IP地址

5. 通過request 獲得請求頭

    long getDateHeader(String name)
    String getHeader(String name)
    Enumeration getHeaderNames()
    Enumeration getHeaders(String name)
    int getIntHeader(String name)

       注:  referer :     n. 參照頁,引用頁; 推薦人

              作用:  執行該此訪問的來源 ,  做防盜鏈時使用 該資訊

6. 通過request 獲得請求體

     request 請求的概念是 通過post提交的請求引數的,  若果是get 則沒有請求體(直接跟在 ? 後邊 , 多個引數用 & 連線 )

     格式: 

      username=zhangsan&password=123&hobby=football&hobby=basketball

      key ---------------------- value

      username                    [zhangsan]

      password                    [123]

      hobby                         [football,basketball]

    以上述為例子: 獲取請求引數 (get 和 post 都可以通過以下方式獲得) : 

    String getParameter(String name) 
    String[] getParameterValues(String name)
    Enumeration getParameterNames()
    Map<String,String[]> getParameterMap()

    注:  亂碼處理 (括號內的是我個人拙見) :

         •  解決post提交方式的亂碼 (引數還在請求體中, 可以先行設定編碼,然後通過瀏覽器處理後 直接就是utf8的編碼):

                               request.setCharacterEncoding("UTF-8");

         •  解決get提交的方式的亂碼 (因為get方式是直接在連結過邊加的不經過瀏覽器處理, 得到的是原編碼,  想要改變編碼需要有先解碼再編碼的過程):

     String name = request.getParameter("name");
     name = new String(name.getBytes("ISO-8859-1"),"UTF-8");

 

附加  request 的其他功能:

      1. request 是一個域物件 

          request 物件也是一個儲存資料的區域物件, 所以也具有如下方法:     

    setAttribute(String name, Object o)
    getAttribute(String name)
    removeAttribute(String name)

       注: request 域的作用範圍:  一次請求中

       2. request 完成請求轉發  

    獲得請求轉發器-- path是轉發的地址
    RequestDispatcher getRequestDispatcher(String path)
    通過轉發器物件轉發
    requestDispathcer.forward(ServletRequest request, ServletResponse response)

       3. ServletContext域與Request域的生命週期比較?

                   ServletContext :  建立--> 伺服器啟動  ;     銷燬--> 伺服器關閉 ;                     域的作用範圍--> 整個web應用

                   request :  建立--> 訪問時建立request ; 銷燬-->響應結束request銷燬 ;  域的作用範圍--> 一次請求中

       4. 轉發與重定向的區別?

                  •    重定向是 兩次請求, 轉發是一次請求

                  •    重定向位址列的地址變化, 轉發地址不發生變化

                  •    重定向可以訪問外部網站 , 轉發只能訪問內部的網站

                  •    轉發的效能要優於重定向

       5. 客戶端地址與伺服器端的地址的寫法?

                  •    客戶端訪問服務端需要加上 web應用的名稱.

                  •    伺服器內部訪問資源 , 內部的跳轉地址, 不需要寫web應用的名稱

 

          18/12/6  18:00   雨