開發 Web 應用時,常需檢查 HttpServletRequest 物件包含哪些資訊(Header、參數、Session、伺服器資訊等)。本文整理一份可直接複製執行的完整屬性列印程式碼,分別提供 Servlet (Java) 與 JSP 兩種版本,方便除錯與教學參考。
@WebServlet("/request-info")
public class RequestInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("=== HttpServletRequest 完整屬性 ===");
System.out.println("Protocol: " + request.getProtocol());
System.out.println("Scheme: " + request.getScheme());
System.out.println("Server Name: " + request.getServerName());
System.out.println("Server Port: " + request.getServerPort());
System.out.println("Server Info: " + getServletConfig().getServletContext().getServerInfo());
System.out.println("Remote Addr: " + request.getRemoteAddr());
System.out.println("Remote Host: " + request.getRemoteHost());
System.out.println("Character Encoding: " + request.getCharacterEncoding());
System.out.println("Content Length: " + request.getContentLength());
System.out.println("Content Type: " + request.getContentType());
System.out.println("Auth Type: " + request.getAuthType());
System.out.println("HTTP Method: " + request.getMethod());
System.out.println("Path Info: " + request.getPathInfo());
System.out.println("Path Translated: " + request.getPathTranslated());
System.out.println("Query String: " + request.getQueryString());
System.out.println("Remote User: " + request.getRemoteUser());
System.out.println("Requested Session Id: " + request.getRequestedSessionId());
System.out.println("Request URI: " + request.getRequestURI());
System.out.println("Servlet Path: " + request.getServletPath());
// 常用 Header
String[] headers = {"Accept", "Host", "Referer", "Accept-Language",
"Accept-Encoding", "User-Agent", "Connection", "Cookie"};
for (String h : headers) {
System.out.println(h + ": " + request.getHeader(h));
}
// Session 資訊
HttpSession session = request.getSession(false);
if (session != null) {
System.out.println("Session Created: " + new Date(session.getCreationTime()));
System.out.println("Session Last Accessed: " + new Date(session.getLastAccessedTime()));
}
}
}
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
<h3>HttpServletRequest 完整屬性</h3>
<pre>
<%
out.println("Protocol: " + request.getProtocol());
out.println("Scheme: " + request.getScheme());
out.println("Server Name: " + request.getServerName());
out.println("Server Port: " + request.getServerPort());
out.println("Server Info: " + getServletConfig().getServletContext().getServerInfo());
out.println("Remote Addr: " + request.getRemoteAddr());
out.println("Remote Host: " + request.getRemoteHost());
out.println("Character Encoding: " + request.getCharacterEncoding());
out.println("Content Length: " + request.getContentLength());
out.println("Content Type: " + request.getContentType());
out.println("Auth Type: " + request.getAuthType());
out.println("HTTP Method: " + request.getMethod());
out.println("Path Info: " + request.getPathInfo());
out.println("Path Translated: " + request.getPathTranslated());
out.println("Query String: " + request.getQueryString());
out.println("Remote User: " + request.getRemoteUser());
out.println("Requested Session Id: " + request.getRequestedSessionId());
out.println("Request URI: " + request.getRequestURI());
out.println("Servlet Path: " + request.getServletPath());
String[] headers = {"Accept", "Host", "Referer", "Accept-Language",
"Accept-Encoding", "User-Agent", "Connection", "Cookie"};
for (String h : headers) {
out.println(h + ": " + request.getHeader(h));
}
HttpSession session = request.getSession(false);
if (session != null) {
out.println("Session Created: " + new Date(session.getCreationTime()));
out.println("Session Last Accessed: " + new Date(session.getLastAccessedTime()));
}
%>
</pre>
</body>
</html>
| 分類 | 方法 | 說明 |
|---|---|---|
| 請求行 | getMethod() | HTTP 方法 (GET/POST/PUT...) |
| getRequestURI() | 完整請求 URI (含 context path) | |
| getServletPath() | 對應 Servlet 映射路徑 | |
| getPathInfo() | Servlet 路徑後的額外路徑 | |
| getQueryString() | 查詢字串 (未解碼) | |
| 伺服器/連線 | getServerName()/getServerPort() | 伺服器主機名/埠號 |
| getScheme() | http 或 https | |
| getProtocol() | HTTP/1.1 等 | |
| getRemoteAddr()/getRemoteHost() | 客戶端 IP/主機名 | |
| 內容協商 | getContentType() | 請求體 MIME 類型 |
| getContentLength() | 請求體長度 (bytes) | |
| getCharacterEncoding() | 請求體編碼 | |
| 安全/認證 | getAuthType() | 認證機制 (BASIC/FORM/CLIENT_CERT) |
| getRemoteUser() | 經認證的使用者名稱 | |
| getRequestedSessionId() | 客戶端攜帶的 Session ID | |
| Header 存取 | getHeader(name) | 單一 Header 值 |
| getHeaders(name) | 同名 Header 所有值 (Enumeration) |
// 所有 Header
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
Enumeration<String> values = request.getHeaders(name);
while (values.hasMoreElements()) {
System.out.println(name + " = " + values.nextElement());
}
}
// 所有 Parameter (GET/POST 合併)
Map<String, String[]> paramMap = request.getParameterMap();
paramMap.forEach((k, v) -> System.out.println(k + " = " + Arrays.toString(v)));
getRemoteAddr() 在反向代理 (Nginx/Apache) 後會取到代理 IP,需讀取 X-Forwarded-For Header。getContentLength() 回傳 int,大檔案上傳請用 getContentLengthLong() (Servlet 3.1+)。request 型別為 HttpServletRequest,可直接呼叫上述方法。