首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深入理解 HTTP 請求頭與 Servlet 讀取實戰

     編輯:Java 相關知識

HTTP 協議是 Web 通信的基石,而請求頭則是客戶端(如瀏覽器)向伺服器傳遞上下文資訊的關鍵載體。掌握常見請求頭的含義,並熟練在 Servlet 中讀取它們,是 Java Web 開發的必備技能。

核心請求頭詳解

當瀏覽器發起請求時,會攜帶多個頭欄位,以下為最常見且實用的請求頭:

  • Accept:瀏覽器可處理的 MIME 類型(如 text/html、application/json)。
  • Accept-Charset:支援的字元集(如 UTF-8、Big5)。
  • Accept-Encoding:支援的壓縮編碼(如 gzip、deflate),善用此頭可大幅減少傳輸體積。
  • Accept-Language:偏好語言(如 zh-TW、en-US),多語言站點據此返回對應版本。
  • Authorization:攜帶認證憑證,配合 WWW-Authenticate 實現基本/摘要認證。
  • Connection:控制持久連線(Keep-Alive),HTTP/1.1 預設開啟,減少 TCP 握手開銷。
  • Content-Length:POST 請求體長度(位元組),POST 請求必須包含此頭。
  • Cookie:攜帶會話標識,是狀態管理的核心機制。
  • Host:目標主機名與埠號,虛擬主機環境下路由依賴此頭。
  • If-Modified-Since:條件請求頭,配合快取策略,未修改時返回 304。
  • Referer:來源頁面 URL,常用於防盜鏈或統計分析。
  • User-Agent:客戶端身份標識,可據此適配不同裝置或瀏覽器特性。

此外,IE 曾發送非標準頭 UA-Pixels、UA-Color、UA-OS、UA-CPU 傳遞螢幕、色深、作業系統、CPU 資訊,現代開發已極少依賴。

Servlet 中讀取請求頭的 API

HttpServletRequest 提供靈活的讀取方式:

  • getHeader(String name):取得指定頭的字串值,不存在返回 null。
  • getHeaders(String name):取得同名頭的所有值(Enumeration)。
  • getHeaderNames():取得所有頭名稱的 Enumeration,適合遍歷輸出。
  • 專用便利方法:getCookies()、getAuthType()、getRemoteUser()、getDateHeader()、getIntHeader()。

同時可從請求行獲取核心資訊:getMethod()(GET/POST 等)、getRequestURI()、getProtocol()(HTTP/1.1 等)。

實戰範例:輸出所有請求頭

以下 Servlet 以表格形式展示所有請求頭及請求行三要素:

package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class ShowRequestHeaders extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "顯示所有請求頭";
        out.println("<!DOCTYPE html><html><head><title>" + title + "</title></head><body>");
        out.println("<h1 align='center'>" + title + "</h1>");
        out.println("<b>Request Method: </b>" + request.getMethod() + "<br>");
        out.println("<b>Request URI: </b>" + request.getRequestURI() + "<br>");
        out.println("<b>Request Protocol: </b>" + request.getProtocol() + "<br><br>");
        out.println("<table border='1' align='center'><tr bgcolor='#FFAD00'><th>Header Name<th>Header Value");
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            out.println("<tr><td>" + headerName + "<td>" + request.getHeader(headerName));
        }
        out.println("</table></body></html>");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

部署後訪問該 Servlet,即可直觀查看瀏覽器發送的完整請求頭資訊,極利於除錯與協議分析。

最佳實踐提醒

  1. 請求頭鍵值不區分大小寫,但建議以標準寫法(如 User-Agent)讀取。
  2. 敏感資訊(如 Authorization、Cookie)切勿記錄到日誌,防止洩露。
  3. 善用 Accept-Encoding 配合 GZIP 過濾器,可顯著降低頻寬消耗。
  4. 條件請求頭(If-Modified-Since、If-None-Match)是 HTTP 快取的基石,正確實現可大幅提升效能。

完整 HTTP 頭規範請參考 W3C HTTP 標準。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved