JSP 客戶端請求

JSP 客戶端請求

當瀏覽器請求一個網頁時,它會向網路伺服器傳送一系列不能被直接讀取的資訊,因為這些資訊是作為HTTP資訊頭的一部分來傳送的。您可以查閱HTTP協議來獲得更多的資訊。

下表列出了瀏覽器端資訊頭的一些重要內容,在以後的網路程式設計中將會經常見到這些資訊:

資訊 描述
Accept 指定瀏覽器或其他客戶端可以處理的MIME型別。它的值通常為 image/png 或 image/jpeg
Accept-Charset 指定瀏覽器要使用的字符集。比如 ISO-8859-1
Accept-Encoding 指定編碼型別。它的值通常為 gzip 或compress
Accept-Language 指定客戶端首選語言,servlet會優先返回以當前語言構成的結果集,如果servlet支援這種語言的話。比如 en,en-us,ru等等
Authorization 在訪問受密碼保護的網頁時識別不同的使用者
Connection 表明客戶端是否可以處理HTTP持久連線。持久連線允許客戶端或瀏覽器在一個請求中獲取多個檔案。Keep-Alive 表示啟用持久連線
Content-Length 僅適用於POST請求,表示 POST 資料的位元組數
Cookie 返回先前傳送給瀏覽器的cookies至伺服器
Host 指出原始URL中的主機名和埠號
If-Modified-Since 表明只有當網頁在指定的日期被修改後客戶端才需要這個網頁。 伺服器傳送304碼給客戶端,表示沒有更新的資源
If-Unmodified-Since 與If-Modified-Since相反, 只有文件在指定日期後仍未被修改過,操作才會成功
Referer 標誌著所引用頁面的URL。比如,如果你在頁面1,然後點了個連結至頁面2,那麼頁面1的URL就會包含在瀏覽器請求頁面2的資訊頭中
User-Agent 用來區分不同瀏覽器或客戶端傳送的請求,並對不同型別的瀏覽器返回不同的內容

HttpServletRequest類

request物件是javax.servlet.http.HttpServletRequest類的例項。每當客戶端請求一個頁面時,JSP引擎就會產生一個新的物件來代表這個請求。

request物件提供了一系列方法來獲取HTTP資訊頭,包括表單資料,cookies,HTTP方法等等。

接下來將會介紹一些在JSP程式設計中常用的獲取HTTP資訊頭的方法。詳細內容請見下表:

序號 方法& 描述
1 Cookie[] getCookies()

返回客戶端所有的Cookie的陣列
2 Enumeration getAttributeNames()

返回request物件的所有屬性名稱的集合
3 Enumeration getHeaderNames()

返回所有HTTP頭的名稱集合
4 Enumeration getParameterNames()

返回請求中所有引數的集合
5 HttpSession getSession()

返回request對應的session物件,如果沒有,則建立一個
6 HttpSession getSession(boolean create)

返回request對應的session物件,如果沒有並且引數create為true,則返回一個新的session物件
7 Locale getLocale()

返回當前頁的Locale物件,可以在response中設定
8 Object getAttribute(String name)

返回名稱為name的屬性值,如果不存在則返回null。
9 ServletInputStream getInputStream()

返回請求的輸入流
10 String getAuthType()

返回認證方案的名稱,用來保護servlet,比如 "BASIC" 或者 "SSL" 或 null 如果 JSP沒設定保護措施
11 String getCharacterEncoding()

返回request的字元編碼集名稱
12 String getContentType()

返回request主體的MIME型別,若未知則返回null
13 String getContextPath()

返回request URI中指明的上下文路徑
14 String getHeader(String name)

返回name指定的資訊頭
15 String getMethod()

返回此request中的HTTP方法,比如 GET,,POST,或PUT
16 String getParameter(String name)

返回此request中name指定的引數,若不存在則返回null
17 String getPathInfo()

返回任何額外的與此request URL相關的路徑
18 String getProtocol()

返回此request所使用的協議名和版本
19 String getQueryString()

返回此 request URL包含的查詢字串
20 String getRemoteAddr()

返回客戶端的IP地址
21 String getRemoteHost()

返回客戶端的完整名稱
22 String getRemoteUser()

返回客戶端通過登入認證的使用者,若使用者未認證則返回null
23 String getRequestURI()

返回request的URI
24 String getRequestedSessionId()

返回request指定的session ID
25 String getServletPath()

返回所請求的servlet路徑
26 String[] getParameterValues(String name)

返回指定名稱的引數的所有值,若不存在則返回null
27 boolean isSecure()

返回request是否使用了加密通道,比如HTTPS
28 int getContentLength()

返回request主體所包含的位元組數,若未知的返回-1
29 int getIntHeader(String name)

返回指定名稱的request資訊頭的值
30 int getServerPort()

返回伺服器埠號

HTTP資訊頭示例

在這個例子中,我們會使用HttpServletRequest類的getHeaderNames()方法來讀取HTTP資訊頭。這個方法以列舉的形式返回當前HTTP請求的頭資訊。

獲取Enumeration物件後,用標準的方式來遍歷Enumeration物件,用hasMoreElements()方法來確定什麼時候停止,用nextElement()方法來獲得每個引數的名字。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>入門教學(itread01.com)</title>
</head>
<body>
<h2>HTTP 頭部請求例項</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 = https://www.itread01.com/jsp/request.getHeader(paramName);
      out.println("<td> " + paramValue + "</td></tr>\n");
   }
%>
</table>
</body>
</html>

訪問main.jsp,將會得到以下結果:

您可以在上面程式碼中嘗試HttpServletRequest類的其它方法。