在本章中,我們將在JSP中討論和學習客戶端請求。當流覽器請求網頁時,它會向Web伺服器發送大量資訊。這些資訊不能直接讀取,因為這些資訊作為HTTP請求標頭的一部分。可以通過HTTP協議以瞭解更多資訊。
下表列出了流覽器中的重要HTTP請求頭資訊。這些資訊經常在Web編程中使用 -
編號 | 請求頭 | 描述 |
---|---|---|
1 | Accept |
此請求頭指定流覽器或其他客戶端可以處理的MIME 類型。 image/png 或image/jpeg 是兩種最常見的值。 |
2 | Accept-Charset |
此請求頭指定流覽器可用於顯示資訊的字元集。 例如:ISO-8859-1 ,UTF-8 和GB2312 等。 |
3 | Accept-Encoding |
此請求頭指定流覽器知道如何處理的編碼類型。gzip 或compress 是兩種最常見的值。 |
4 | Accept-Language |
此請求頭指定客戶端的首選語言,以防servlet可以使用多種語言生成結果。例如:en ,en-us ,ru 等 |
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 ,或者如果沒有當前會話,並且create 為true ,則返回創建一個新會話。 |
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方法的名稱,例如:GET ,POST 或PUT 。 |
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 ,得到以下結果 -