- Servlet 教程
- Servlet - 首頁
- Servlet - 概述
- Servlet - 環境設定
- Servlet - 生命週期
- Servlet - 示例
- Servlet - 表單資料
- Servlet - 客戶端請求
- Servlet - 服務端響應
- Servlet - HTTP狀態碼
- Servlet - 編寫過濾器
- Servlet - 異常處理
- Servlet - Cookie處理
- Servlet - Session跟蹤
- Servlet - 資料庫訪問
- Servlet - 檔案上傳
- Servlet - 日期處理
- Servlet - 頁面重定向
- Servlet - 點選計數器
- Servlet - 自動重新整理
- Servlet - 傳送郵件
- Servlet - 打包
- Servlet - 除錯
- Servlet - 國際化
- Servlet - 註解
- Servlet 有用資源
- Servlet - 問答
- Servlet - 快速指南
- Servlet - 有用資源
- Servlet - 討論
Servlet - 客戶端HTTP請求
當瀏覽器請求網頁時,它會向Web伺服器傳送大量資訊,這些資訊無法直接讀取,因為這些資訊作為HTTP請求頭的部分傳輸。您可以檢視HTTP協議以獲取更多資訊。
以下是來自瀏覽器端的重要頭部資訊,您在Web程式設計中會經常使用:
| 序號 | 頭部 & 描述 |
|---|---|
| 1 | Accept 此頭部指定瀏覽器或其他客戶端可以處理的MIME型別。image/png或image/jpeg是兩種最常見的可能性。 |
| 2 | Accept-Charset 此頭部指定瀏覽器可以使用哪些字元集來顯示資訊。例如 ISO-8859-1。 |
| 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中指定的host和port。 |
| 10 | If-Modified-Since 此頭部指示客戶端僅在指定日期之後更改頁面才需要該頁面。如果沒有任何更新的結果,伺服器會發送程式碼304,表示未修改。 |
| 11 | If-Unmodified-Since 此頭部與If-Modified-Since相反;它指定只有當文件早於指定日期時,操作才能成功。 |
| 12 | Referer 此頭部指示引用網頁的URL。例如,如果您在網頁1上,並點選指向網頁2的連結,則當瀏覽器請求網頁2時,網頁1的URL將包含在Referer頭部中。 |
| 13 | User-Agent 此頭部標識發出請求的瀏覽器或其他客戶端,並可用於向不同型別的瀏覽器返回不同的內容。 |
讀取HTTP頭部的方法
在servlet程式中可以使用以下方法讀取HTTP頭部。這些方法可用於HttpServletRequest物件
| 序號 | 方法 & 描述 |
|---|---|
| 1 | Cookie[] getCookies() 返回一個包含客戶端隨此請求傳送的所有Cookie物件的陣列。 |
| 2 | Enumeration getAttributeNames() 返回一個包含此請求可用的屬性名稱的Enumeration。 |
| 3 | Enumeration getHeaderNames() 返回此請求包含的所有頭部名稱的列舉。 |
| 4 | Enumeration getParameterNames() 返回一個包含此請求中包含的引數名稱的String物件的列舉。 |
| 5 | HttpSession getSession() 返回與此請求關聯的當前會話,或者如果請求沒有會話,則建立一個新會話。 |
| 6 | HttpSession getSession(boolean create) 返回與此請求關聯的當前HttpSession,或者如果沒有當前會話並且create的值為true,則返回一個新的會話。 |
| 7 | Locale getLocale() 根據Accept-Language頭部返回客戶端將接受內容的首選Locale。 |
| 8 | Object getAttribute(String name) 返回值為名為name的屬性的物件,如果不存在給定名稱的屬性,則返回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() 返回傳送請求的客戶端的網際網路協議(IP)地址。 |
| 21 | String getRemoteHost() 返回傳送請求的客戶端的完全限定名稱。 |
| 22 | String getRemoteUser() 返回發出此請求的使用者的登入名(如果使用者已透過身份驗證),如果使用者未透過身份驗證,則返回null。 |
| 23 | String getRequestURI() 返回此請求的URL中從協議名稱到HTTP請求第一行中的查詢字串的部分。 |
| 24 | String getRequestedSessionId() 返回客戶端指定的會話ID。 |
| 25 | String getServletPath() 返回此請求的URL中呼叫JSP的部分。 |
| 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請求關聯的頭部資訊的Enumeration。
一旦我們有了Enumeration,我們就可以使用標準方式迴圈遍歷Enumeration,使用hasMoreElements()方法確定何時停止,並使用nextElement()方法獲取每個引數名稱。
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class DisplayHeader extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "HTTP Header Request Example";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n"+
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<table width = \"100%\" border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
"<th>Header Name</th><th>Header Value(s)</th>\n"+
"</tr>\n"
);
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");
}
out.println("</table>\n</body></html>");
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
現在呼叫上述servlet將生成以下結果:
HTTP Header Request Example
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
