HttpServletRequest 是 Servlet 容器封裝 HTTP 請求的核心介面,提供協議、Header、參數、Session、客戶端資訊等完整存取能力。本文整理最常用的 API,並對比 Java Servlet 與 JSP 兩種寫法差異。
| 類別 | 常用方法 | 說明 |
|---|---|---|
| 請求行 | getMethod(), getRequestURI(), getServletPath(), getQueryString() | HTTP 方法、URI、Servlet 路徑、查詢字串 |
| 協議資訊 | getProtocol(), getScheme(), getServerName(), getServerPort() | HTTP/1.1、http/https、主機名、埠號 |
| 客戶端資訊 | getRemoteAddr(), getRemoteHost(), getRemoteUser(), getAuthType() | IP、主機名、認證用戶、認證類型 |
| Header 存取 | getHeader(String), getHeaders(String), getHeaderNames() | 單值、多值、所有 Header 名稱 |
| 參數處理 | getParameter(String), getParameterValues(String), getParameterMap() | 表單/查詢參數 |
| Session 管理 | getSession(), getSession(boolean), getRequestedSessionId() | 取得/建立 Session、獲取請求攜帶的 Session ID |
| 輸入流 | getInputStream(), getReader() | 讀取原始 Body (JSON、XML、檔案上傳) |
| 屬性傳遞 | setAttribute(), getAttribute(), removeAttribute() | 請求域共享資料 (Filter、Interceptor、Forward) |
@WebServlet("/request-info")
public class RequestInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/plain;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("=== 請求行 ===");
out.println("Method: " + req.getMethod());
out.println("RequestURI: " + req.getRequestURI());
out.println("ServletPath: " + req.getServletPath());
out.println("QueryString: " + req.getQueryString());
out.println("\n=== 協議與伺服器 ===");
out.println("Protocol: " + req.getProtocol());
out.println("Scheme: " + req.getScheme());
out.println("ServerName: " + req.getServerName());
out.println("ServerPort: " + req.getServerPort());
out.println("\n=== 客戶端 ===");
out.println("RemoteAddr: " + req.getRemoteAddr());
out.println("RemoteHost: " + req.getRemoteHost());
out.println("RemoteUser: " + req.getRemoteUser());
out.println("AuthType: " + req.getAuthType());
out.println("\n=== Header (常用) ===");
String[] headers = {"Accept", "Host", "Referer", "Accept-Language", "Accept-Encoding", "User-Agent", "Connection", "Cookie"};
for (String h : headers) {
out.println(h + ": " + req.getHeader(h));
}
out.println("\n=== Session ===");
HttpSession session = req.getSession(false);
if (session != null) {
out.println("SessionId: " + session.getId());
out.println("Created: " + new Date(session.getCreationTime()));
out.println("LastAccessed: " + new Date(session.getLastAccessedTime()));
} else {
out.println("No existing session");
}
}
}
JSP 隱含物件 request 即為 HttpServletRequest,使用 out.println() 輸出:
<%@ page contentType="text/plain;charset=UTF-8" %>
<%
out.println("Method: " + request.getMethod());
out.println("RequestURI: " + request.getRequestURI());
// ... 其他同上
HttpSession session = request.getSession(false);
if (session != null) {
out.println("Session Created: " + session.getCreationTime());
}
%>
X-Forwarded-For 或 X-Real-IP Header。getInputStream() / getReader() 互斥且不可重複讀取,需配合 HttpServletRequestWrapper 快取 Body 供多次讀取(如日誌攔截器)。getParameterMap() 返回不可修改的 Map,Spring MVC 會自動轉換為多值處理。request.setCharacterEncoding("UTF-8") 必須在讀取參數前呼叫,否則中文亂碼。@GetMapping("/info")
public Map info(HttpServletRequest request) {
Map map = new HashMap<>();
map.put("method", request.getMethod());
map.put("uri", request.getRequestURI());
map.put("ip", request.getHeader("X-Forwarded-For") != null
? request.getHeader("X-Forwarded-For").split(",")[0].trim()
: request.getRemoteAddr());
map.put("userAgent", request.getHeader("User-Agent"));
map.put("sessionId", request.getSession().getId());
return map;
}