在本章中,我們將在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 檔頭中。 |
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() |
返回接收到此請求的埠號。 |
以下是使用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 ,得到以下結果 -