Servlet 用戶端 HTTP 請求


當瀏覽器請求網頁時,它會向 Web 伺服器發送特定訊息,這些訊息不能直接讀取,因為這些訊息是作為 HTTP 請求的頭的一部分進行傳輸的。您可以查看 HTTP 協定 以了解更多相關資訊。

以下是來自瀏覽器端的重要頭訊息,您可以在Web 程式設計中頻繁使用:

頭資訊描述
Accept這個頭資訊指定瀏覽器或其他用戶端可以處理的MIME 類型。值 image/pngimage/jpeg 是最常見的兩個可能值。
Accept-Charset這個頭資訊指定瀏覽器可以用來顯示資訊的字元集。例如 ISO-8859-1。
Accept-Encoding這個頭訊息指定瀏覽器知道如何處理的編碼類型。值 gzipcompress 是最常見的兩種可能值。
Accept-Language這個頭資訊指定客戶端的首選語言,在這種情況下,Servlet 會產生多種語言的結果。例如,en、en-us、ru 等。
Authorization這個頭資訊用於客戶端在存取受密碼保護的網頁時識別自己的身分。
Connection這個頭資訊指示客戶端是否可以處理持久 HTTP 連線。持久連線允許客戶端或其他瀏覽器透過單一請求來檢索多個檔案。值 Keep-Alive 表示使用了持續連線。
Content-Length這個頭資訊只適用於 POST 請求,並給出 POST 資料的大小(以位元組為單位)。
Cookie這個頭資訊把之前傳送到瀏覽器的 cookies 回傳到伺服器。
Host這個頭資訊指定原始的 URL 中的主機和連接埠。
If-Modified-Since這個頭資訊表示只有當頁面在指定的日期後已更改時,客戶端想要的頁面。如果沒有新的結果可以使用,伺服器會傳送一個 304 程式碼,表示 Not Modified 頭資訊。
If-Unmodified-Since這個頭資訊是If-Modified-Since 的對立面,它指定只有當文件早於指定日期時,操作才會成功。
Referer這個頭訊息指示所指向的 Web 頁的 URL。例如,如果您在網頁 1,點擊連結到網頁 2,當瀏覽器要求網頁 2 時,網頁 1 的 URL 就會包含在 Referer 頭資訊中。
User-Agent這個頭資訊識別發出請求的瀏覽器或其他客戶端,並且可以向​​不同類型的瀏覽器傳回不同的內容。

讀取 HTTP 頭的方法

下面的方法可用在 Servlet 程式中讀取 HTTP 頭。這些方法透過 HttpServletRequest 物件可用。

序號方法& 描述
#1Cookie[] getCookies()
傳回一個數組,包含客戶端發送該請求的所有的Cookie 物件。
2Enumeration getAttributeNames()
#傳回一個枚舉,包含提供給該要求可用的屬性名稱。
3Enumeration getHeaderNames()
傳回一個枚舉,包含在該請求中包含的所有的頭名。
4Enumeration getParameterNames()
傳回一個String 物件的枚舉,包含在該請求中包含的參數的名稱。
5HttpSession getSession()
返回與該請求關聯的目前session 會話,或如果請求沒有session 會話,則創建一個。
6HttpSession getSession(boolean create)
傳回與該請求關聯的目前HttpSession,或如果沒有目前會話,且創建是真的,則傳回一個新的session 會話。
7Locale getLocale()
基於 Accept-Language 頭,傳回客戶端接受內容的首選的區域設定。
8Object getAttribute(String name)
以物件形式傳回已命名屬性的值,如果沒有給定名稱的屬性存在,則傳回null。
9ServletInputStream getInputStream()
使用 ServletInputStream,以二進位資料形式檢索要求的主體。
10String getAuthType()
傳回用於保護Servlet 的驗證方案的名稱,例如,"BASIC" 或"SSL",如果JSP沒有受到保護則傳回null。
11String getCharacterEncoding()
傳回請求主體中使用的字元編碼的名稱。
12String getContentType()
傳回請求主體的 MIME 類型,如果不知道類型則傳回 null。
13String getContextPath()
傳回指示請求上下文的請求 URI 部分。
14String getHeader(String name)
以字串形式傳回指定的請求頭的值。
15String getMethod()
傳回請求的 HTTP 方法的名稱,例如,GET、POST 或 PUT。
16String getParameter(String name)
以字串形式傳回請求參數的值,或者如果參數不存在則傳回null。
17String getPathInfo()
當請求發出時,傳回與客戶端發送的URL 相關的任何額外的路徑資訊.
18String getProtocol()
傳回請求協議的名稱和版本。
19String getQueryString()
傳回包含在路徑後的請求 URL 中的查詢字串。
20String getRemoteAddr()
傳回發送請求的客戶端的網際網路通訊協定(IP)位址。
21String getRemoteHost()
傳回發送請求的客戶端的完全限定名稱。
22String getRemoteUser()
如果用戶已通過身份驗證,則傳回發出請求的登入用戶,或者如果用戶未通過身份驗證,則傳回null。
23String getRequestURI()
從協定名稱直到HTTP 請求的第一行的查詢字串中,傳回該請求的URL 的一部分。
24String getRequestedSessionId()
#傳回由客戶端指定的 session 會話 ID。
25String getServletPath()
傳回呼叫 JSP 的請求的 URL 的一部分。
26String[] getParameterValues(String name)
傳回字串物件的數組,包含所有給定的請求參數的值,如果參數不存在則傳回null。
27boolean isSecure()
傳回一個布林值,指示請求是否使用安全通道,如 HTTPS。
28int getContentLength()
以位元組為單位傳回請求主體的長度,並提供輸入流,或者如果長度未知則回傳-1。
29int getIntHeader(String name)
傳回指定的請求頭的值為一個 int 值。
30int getServerPort()
傳回接收到這個請求的連接埠號碼。

HTTP Header 請求實例

下面的實例使用 HttpServletRequest 的 getHeaderNames() 方法讀取 HTTP 頭資訊。此方法傳回一個枚舉,包含與目前的 HTTP 請求相關的頭資訊。

一旦我們有一個枚舉,我們可以以標準方式循環枚舉,使用hasMoreElements() 方法來確定何時停止,使用nextElement() 方法來取得每個參數的名稱。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// 扩展 HttpServlet 类
public class DisplayHeader extends HttpServlet {
 
  // 处理 GET 方法请求的方法
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置响应内容类型
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
	  String title = "HTTP Header 请求实例";
      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 名称</th><th>Header 值</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>");
  }
  // 处理 POST 方法请求的方法
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

現在,呼叫上面的Servlet 會產生以下結果:

HTTP Header 請求實例

##Header 名稱Header 值accept*/*accept-languageen -ususer-agentMozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; MS-RTC LM 8) accept-encodinggzip, deflatehostlocalhost:8080connectionKeep-Alivecache-controlno-cache
#### ##########