天天看點

Servlet--HttpServletRequest擷取請求資訊(請求頭、請求行、參數)詳解

ttpServletRequest對象概述

在Servlet API中,定義了一個HttpServletRequest接口,它繼承自ServletReauest接口,專門用來封裝HTTP請求消息。由于HTTP請求消息分為請求行、請求消息頭和請求消息體三部分,是以,在HttpServletRequest接口中定義了擷取請求行、請求頭和請求消息體的相關方法。

我們在建立Servlet時會覆寫service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個為代表請求的request和代表響應response。

service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大,今天我們學習HttpServletRequest。

request的運作流程

Servlet--HttpServletRequest擷取請求資訊(請求頭、請求行、參數)詳解

通過抓包工具抓取HTTP請求

Servlet--HttpServletRequest擷取請求資訊(請求頭、請求行、參數)詳解

通過request獲得請求行資訊

當通路Servlet時,會在請求消息的請求行中,包含請求方法、請求資源名、請求路徑等資訊,為了擷取這些資訊,在HTTPServletRequest接口中,定義了一系列用于擷取請求行的方法,如下表:

方法聲明 功能描述
String getmethod() 該方法用于擷取HTTP請求消息中的請求方式(如GET、POST等)
String getReauestURI() 該方法用于擷取請求行中資源名稱部分,即位于URL的主機和端口之後、參數部分之前的部分
String getQueryString() 該方法用于擷取請求行中的參數部分,也就是資源路徑後面問号以後的所有内容
String getProtocol() 該方法用于擷取請求行中的協定名和版本,例如,HTTP/1.0 或 HTTP/1.1
String getContextPath( ) 該方法用于擷取請求URL中屬于WEB應用程式的路徑,這個路徑以"/"開頭,表示相對于整個WEB站點的根目錄,路幾個結尾不含“/”。如果請求URL屬于web站點的根目錄,那麼傳回結果為空字元串“”
String getServletPath() 該方法用于擷取Servlet的名稱或Servlet所映射的路徑
String getRemoteAddr( ) 該方法用于擷取請求用戶端的IP位址,其格式類似于"192.168.0.1"
String getRemoteHost() 該方法用于擷取請求用戶端的完整主機名,其格式類似于"pc1.xxxx.cn"。需要注意的是,如果無
int getRemotePort() 該方法用于擷取請求用戶端網絡連接配接的端口号
String getLocalAddr() 該方法用于擷取Web伺服器上接收目前請求網絡連接配接的IP位址
String getLocalName() 該方法用于擷取Web伺服器上接收目前網絡連接配接IP所對應的主機名
int getLocalPort() 該方法用于擷取Web伺服器上接收目前網絡連接配接的端口号
String getServerName() 該方法用于擷取目前請求所指向的主機名,即HTTP請求消息中HOST頭字段所對應的主機名部分
int getServerPort() 該方法用于擷取目前請求所連接配接的伺服器端口号,即如果HTTP請求消息中HOST頭字段所對應的端口号部分
String getScheme() 該方法用于擷取請求的協定名,例如http、https或ftp
StringBuffer getRequestURL() 該方法用于擷取用戶端送出請求時的完整URL,包括協定、伺服器名、端口号、資源路徑等資訊,但不包括後面的查詢參數部分。注意,getRequestRUL()方法傳回的時StringBuffer類型,而不是String類型。

示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //擷取請求行的相關資訊
        out.println("getMethod:" + request.getMethod() + "<br/>");
        out.println("getQueryString:" + request.getQueryString() + "<br/>");
        out.println("getProtocol:" + request.getProtocol() + "<br/>");
        out.println("getContextPath" + request.getContextPath() + "<br/>");
        out.println("getPathInfo:" + request.getPathInfo() + "<br/>");
        out.println("getPathTranslated:" + request.getPathTranslated() + "<br/>");
        out.println("getServletPath:" + request.getServletPath() + "<br/>");
        out.println("getRemoteAddr:" + request.getRemoteAddr() + "<br/>");
        out.println("getRemoteHost:" + request.getRemoteHost() + "<br/>");
        out.println("getRemotePort:" + request.getRemotePort() + "<br/>");
        out.println("getLocalAddr:" + request.getLocalAddr() + "<br/>");
        out.println("getLocalName:" + request.getLocalName() + "<br/>");
        out.println("getLocalPort:" + request.getLocalPort() + "<br/>");
        out.println("getServerName:" + request.getServerName() + "<br/>");
        out.println("getServerPort:" + request.getServerPort() + "<br/>");
        out.println("getScheme:" + request.getScheme() + "<br/>");
        out.println("getRequestURL:" + request.getRequestURL() + "<br/>");
    }
           

通過浏覽器通路,頁面顯示:

Servlet--HttpServletRequest擷取請求資訊(請求頭、請求行、參數)詳解

通過request獲得請求頭

當請求Servlet時,需要通過請求頭向伺服器傳遞附加資訊,例如,用戶端可以接收的資料類型,壓縮方式,語言等。為此,在HttpServletRequest接口中,定義了一系列用于擷取HTTP請求頭字段的方法,如下表:

方法聲明 功能描述
String getHeader(String name) 該方法用于擷取一個指定頭字段的值,如果請求消息中沒有包含指定的頭字段,getHeader()方法傳回null;如果請求消息中包含有多個指定名稱的頭字段,getHeader()方法傳回其中第一個頭字段的值
Enumeration getHeaders(String name) 該方法傳回一個Enumeration集合對象,該集合對象由請求消息中出現的某個指定名稱的所有頭字段值組成。在多數情況下,一個頭字段名在請求消息中隻出現一次,但有時候可能會出現多次
Enumeration getheaderNames() 該方法用于擷取一個包含所有請求頭字段的Enumeration對象
int getIntHeader(String name) 該方法用于擷取指定名稱的頭字段,并且将其值轉換為int類型。需要注意的是,如果指定名稱的頭字段不存在,傳回值為-1;如果擷取到的頭字段的值不能轉為int類型,将發生NumberFormatException異常
Long getDateHeader(String name) 該方法用于擷取指定頭字段的值,并将其按GMT時間格式轉換成一個代表日期/時間的長整數,這個長整數是自1970年1月1日0點0分0秒算起的以毫秒為機關的時間值
String getContentType() 該方法用于擷取Content-Type頭字段的值,結果為String類型
int getContentLength() 該方法用于擷取Content-Length頭字段的值,結果為int類型
String getCharacterEncoding() 該方法用于傳回請求消息的實體部分的字元集編碼,通常是從Content-Type頭字段中進行提取,結果為String類型

示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //擷取請求頭資訊
        Enumeration headerNames = request.getHeaderNames();
        //使用循環周遊請求頭,并通過getHeader()方法擷取一個指定名稱的頭字段
        while (headerNames.hasMoreElements()){
            String headerName = (String) headerNames.nextElement();
            out.println(headerName + " : " + request.getHeader(headerName) + "<br/>");
        }
    }

           

通過浏覽器通路,頁面顯示:

Servlet--HttpServletRequest擷取請求資訊(請求頭、請求行、參數)詳解

通過request獲得請求體(請求參數)

在實際開發中,經常需要擷取使用者送出的表單資料,例如,使用者名,密碼、電子郵件等,為了友善擷取表單中的請求參數,在HttpServletRequest接口總,定義了一些列擷取請求參數的方法,如下表所示:

方法聲明 功能描述
String getParameter(String name) 該方法用于擷取某個指定名稱的參數值,如果請求消息中沒有包含指定名稱的參數,getParameter()方法傳回null;如果指定名稱的參數存在但沒有設定值,則傳回一個空串;如果請求消息中包含有多個該指定名稱的參數,getParameter()方法傳回第一個出現的參數值
String[] getParameterValues(String name) HTTP請求消息中可以有多個相同名稱的參數(通常由一個包含有多個同名的字段元素的FORM表單生成),如果要獲得HTTP請求消息中的同一個參數名所對應的所有參數值,那麼就應該使用getParameterValues()方法,該方法用于傳回一個String類型的數組
Enumeration getParameterNames() 該方法用于傳回一個包含請求消息中所有參數名的Enumeration對象,在此基礎上,可以對請求消息中的所有參數進行周遊處理
Map getParameterMap() 個體Parameter Map()方法用于将請求消息中的所有參數名和值裝入進一個Map對象中傳回

示例:

建立一個帶有表單的jsp頁面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表單</title>
</head>
<body>
    <form action="/JavaEEDemo/request" method="post">
        使用者名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;碼:<input type="password" name="password"><br/>
        愛&nbsp;&nbsp;好:
        <input type="checkbox" name="hobby" value="sing">唱歌
        <input type="checkbox" name="hobby" value="dance">跳舞
        <input type="checkbox" name="hobby" value="football">足球
        <input type="submit" value="送出">

    </form>
</body>
</html>

           

編寫Servlet的doPost方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("使用者名:" + username);
        System.out.println("密碼:" + password);

        //擷取參數名為hobby的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.println("愛好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.println(hobbys[i] + ", ");
        }
    }

           

通過浏覽器通路jsp頁面:

Servlet--HttpServletRequest擷取請求資訊(請求頭、請求行、參數)詳解

Size:規定文本的尺寸大小。可能的值:從 1 到 7 的數字。浏覽器預設值是 3。

呈現效果:

我是黑體字

我是微軟雅黑

我是華文彩雲

color=#0099ff size=72 #00ffff" size="72">color=#00ffff

color=gray