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檔案: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 ,得到以下結果 -