JSP客戶端請求

在本章中,我們將在JSP中討論和學習客戶端請求。當瀏覽器請求網頁時,它會向Web服務器發送大量信息。這些信息不能直接讀取,因爲這些信息作爲HTTP請求標頭的一部分。可以通過HTTP協議以瞭解更多信息。

下表列出了瀏覽器中的重要HTTP請求頭信息。這些信息經常在Web編程中使用 -

編號

請求頭

描述

1

Accept

此請求頭指定瀏覽器或其他客戶端可以處理的MIME類型。 image/pngimage/jpeg是兩種最常見的值。

2

Accept-Charset

此請求頭指定瀏覽器可用於顯示信息的字符集。 例如:ISO-8859-1UTF-8GB2312等。

3

Accept-Encoding

此請求頭指定瀏覽器知道如何處理的編碼類型。gzipcompress是兩種最常見的值。

4

Accept-Language

此請求頭指定客戶端的首選語言,以防servlet可以使用多種語言生成結果。例如:enen-usru

5

Authorization

訪問受密碼保護的網頁時,客戶端使用此請求頭來標識自己。

6

Connection

此請求頭指示客戶端是否可以處理持久的HTTP連接。 持久連接允許客戶端或其他瀏覽器通過單個請求檢索多個文件。如果是Keep-Alive值表示使用持久連接。

7

Content-Length

此請求頭僅適用於POST請求,並以字節爲單位給出POST數據的大小。

8

Cookie

此請求頭將返回給先前發送到服務器的cookie到瀏覽器。

9

Host

此請求頭指定原始URL中給出的主機和端口。

10

If-Modified-Since

此請求頭表示客戶端僅在指定日期之後更改頁面。 服務器發送代碼304,表示如果沒有較新的結果可用,則不修改標題。

11

If-Unmodified-Since

該請求頭與If-Modified-Since相反; 它指定只有當文檔比指定日期更早時,動作才能成功。

12

Referer

此請求頭指示引薦網頁的URL。 例如,如果位於網頁A並單擊鏈接到網頁B,則當瀏覽器請求網頁B時,網頁A的URL包含在Referer標頭中。

HttpServletRequest對象

request對象是javax.servlet.http.HttpServletRequest對象的一個實例。 每當客戶端請求頁面時,JSP引擎將創建一個新對象來表示該請求。

請求對象提供了獲取包括表單數據,Cookie,HTTP方法等HTTP頭信息的方法。

下表列出了可用於在JSP程序中讀取HTTP頭的重要方法。 HttpServletRequest對象可以使用這些方法,該對象代表Web服務器的客戶端請求。

編號

方法

描述

1

Cookie[] getCookies()

返回一個數組,其中包含客戶端使用此請求發送的所有Cookie對象。

2

Enumeration getAttributeNames()

返回枚舉,其中包含此請求可用屬性的名稱。

3

Enumeration getHeaderNames()

返回此請求包含的所有頭名稱的枚舉。

4

Enumeration getParameterNames()

返回此請求中包含的參數名稱的String對象的枚舉。

5

HttpSession getSession()

返回與此請求相關聯的當前會話,或者如果請求沒有會話,則自動創建一個會話。

6

HttpSession getSession(boolean create)

返回與此請求相關聯的當前HttpSession,或者如果沒有當前會話,並且createtrue,則返回創建一個新會話。

7

Locale getLocale()

根據Accept-Language標頭返回客戶端將接受內容的首選區域設置。

8

Object getAttribute(String name)

作爲Object返回命名屬性的值,如果不存在給定名稱的屬性,則返回null

9

ServletInputStream getInputStream()

使用ServletInputStream將請求的正文作爲二進制數據檢索。

10

String getAuthType()

返回用於保護servlet的認證方案的名稱,例如「BASIC」「SSL」,如果JSP未受保護,則返回null

11

String getCharacterEncoding()

返回此請求正文中使用的字符編碼的名稱。

12

String getContentType()

返回請求主體的MIME類型,如果類型不知道,則返回null

13

String getContextPath()

返回指示請求上下文的請求URI的部分。

14

String getHeader(String name)

String形式返回指定的請求頭的值。

15

String getMethod()

返回發出此請求的HTTP方法的名稱,例如:GETPOSTPUT

16

String getParameter(String name)

String形式返回請求參數的值,如果該參數不存在,則返回null

17

String getPathInfo()

返回與客戶端發出此請求時發送的URL相關聯的任何額外的路徑信息。

18

String getProtocol()

返回請求使用的協議的名稱和版本。

19

String getQueryString()

返回路徑後請求URL中包含的查詢字符串。

20

String getRemoteAddr()

返回發送請求的客戶端的Internet協議(IP)地址。

21

String getRemoteHost()

返回發送請求的客戶端的完全限定名稱。

22

String getRemoteUser()

如果用戶已通過身份驗證,則返回進行此請求的用戶的登錄名,如果用戶未通過身份驗證,則返回null

23

String getRequestURI()

將該請求URL的一部分從協議名稱返回到HTTP請求的第一行中的查詢字符串。

24

String getRequestedSessionId()

返回客戶端指定的會話ID。

25

String getServletPath()

返回調用JSP的請求的URL部分。

26

String[] getParameterValues(String name)

返回包含給定請求參數的所有值的String對象數組,如果該參數不存在,則返回null

27

boolean isSecure()

返回一個布爾值,指示此請求是否使用安全通道(如HTTPS)進行通信。

28

int getContentLength()

返回請求主體的長度(以字節爲單位),並由輸入流提供;如果長度未知,返回-1

29

int getIntHeader(String name)

將指定的請求頭的值作爲int類型返回。

30

int getServerPort()

返回接收到此請求的端口號。

HTTP頭請求示例

以下是使用HttpServletRequest對象的getHeaderNames()方法來讀取HTTP頭信息的示例。此方法返回包含與當前HTTP請求相關聯的頭信息的枚舉。

使用枚舉,可以以標準的方式循環枚舉。這裏使用hasMoreElements()方法來確定何時停止,然後使用nextElement()方法來獲取每個參數名稱的名稱。

首先打開Eclipse,創建一個動態Web項目:ClientRequest,其項目結構如下所示 -

JSP客戶端請求

創建一個JSP文件:index.jsp,其代碼如下所示 -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>客戶端請求參數數據</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <h2>客戶端請求頭參數數據示例</h2>

        <table width="100%" border="1" align="center">
            <tr bgcolor="#949494">
                <th>Header Name</th>
                <th>Header Value(s)</th>
            </tr>
            <%
                Enumeration headerNames = request.getHeaderNames();
                while (headerNames.hasMoreElements()) {
                    String paramName = (String) headerNames.nextElement();
                    out.print("<tr><td>" + paramName + "</td>\n");
                    String paramValue = request.getHeader(paramName);
                    out.println("<td> " + paramValue + "</td></tr>\n");
                }
            %>
        </table>
    </div>
</body>
</html>

執行上面示例代碼,打開瀏覽器訪問URL: http://localhost:8080/ClientRequest/index.jsp ,得到以下結果 -

JSP客戶端請求