HTTP 協議是 Web 通信的基石,而請求頭則是客戶端(如瀏覽器)向伺服器傳遞上下文資訊的關鍵載體。掌握常見請求頭的含義,並熟練在 Servlet 中讀取它們,是 Java Web 開發的必備技能。
當瀏覽器發起請求時,會攜帶多個頭欄位,以下為最常見且實用的請求頭:
text/html、application/json)。zh-TW、en-US),多語言站點據此返回對應版本。WWW-Authenticate 實現基本/摘要認證。Keep-Alive),HTTP/1.1 預設開啟,減少 TCP 握手開銷。此外,IE 曾發送非標準頭 UA-Pixels、UA-Color、UA-OS、UA-CPU 傳遞螢幕、色深、作業系統、CPU 資訊,現代開發已極少依賴。
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,即可直觀查看瀏覽器發送的完整請求頭資訊,極利於除錯與協議分析。
User-Agent)讀取。Accept-Encoding 配合 GZIP 過濾器,可顯著降低頻寬消耗。If-Modified-Since、If-None-Match)是 HTTP 快取的基石,正確實現可大幅提升效能。完整 HTTP 頭規範請參考 W3C HTTP 標準。