當瀏覽器要求一個網頁時,它會向網頁伺服器發送一系列無法直接讀取的訊息,因為這些訊息是作為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 | 用來區分不同瀏覽器或客戶端發送的請求,並對不同類型的瀏覽器傳回不同的內容 |
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()傳回伺服器連接埠號 |
在這個範例中,我們會使用HttpServletRequest類別的getHeaderNames()方法來讀取HTTP訊息頭。這個方法以枚舉的形式傳回目前HTTP請求的頭資訊。
取得Enumeration物件後,用標準的方式來遍歷Enumeration對象,用hasMoreElements()方法來決定何時停止,用nextElement()方法來取得每個參數的名字。
<%@ page import="java.io.*,java.util.*" %><html><head><title>HTTP Header Request Example</title></head><body><center><h2 >HTTP Header Request Example</h2><table 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></center></body></html>
造訪main.jsp,將會得到以下結果:
Header Name | Header Value(s) |
---|---|
accept | */* |
accept-language | en-us |
user-agent | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; MS-RTC LM 8) |
accept-encoding | gzip, deflate |
host | localhost:8080 |
connection | Keep-Alive |
cache-control | no-cache |
您可以在上面程式碼中嘗試HttpServletRequest類別的其它方法。