HttpServletRequest 封裝了客戶端請求的所有資訊:參數、Header、Cookie、Session、上傳檔案等。掌握其核心 API 是 Java Web 開發基礎。本文系統整理常用方法,並附完整「用戶註冊」實戰範例。
| 方法 | 回傳類型 | 用途 | 典型場景 |
|---|---|---|---|
getParameter(String name) | String | 取單個參數值 (表單、Query String) | 登入帳號、搜尋關鍵字 |
getParameterValues(String name) | String[] | 取多值參數 (複選框、多選下拉) | 興趣標籤、權限勾選 |
getParameterMap() | Map<String,String[]> | 一次性取所有參數 | 表單綁定、簽名驗證 |
setCharacterEncoding(String enc) | void | 設定請求體編碼 (POST 必須在讀參數前調用) | 解決中文亂碼 |
getHeader(String name) | String | 取請求頭 | User-Agent、Token、Referer |
getCookies() | Cookie[] | 取所有 Cookie | 記住我、追蹤用戶 |
getSession() / getSession(boolean) | HttpSession | 取/建立 Session | 登入狀態、購物車 |
getMethod() | String | HTTP 方法 (GET/POST/PUT...) | REST 風格判斷 |
getRequestURI() / getRequestURL() | String | 請求路徑 (不含/含域名) | 權限攔截、日誌記錄 |
getRemoteAddr() | String | 客戶端 IP (注意反向代理需讀 X-Forwarded-For) | 風控、地域限制 |
getInputStream() / getReader() | InputStream / BufferedReader | 讀取原始請求體 (JSON、XML) | REST API 接收 JSON |
<form action="zhuce.jsp" method="post">
姓名:<input type="text" name="name"><br>
密碼:<input type="password" name="pwd"><br>
職業:
<input type="radio" name="career" value="農民">農民
<input type="radio" name="career" value="工人">工人
<input type="radio" name="career" value="學生" checked>學生
<input type="radio" name="career" value="教師">教師<br>
喜歡城市:
<select name="city">
<option value="遼寧">遼寧</option>
<option value="湖北">湖北</option>
<option value="河南" selected>河南</option>
</select><br>
愛好:
<input type="checkbox" name="hobby" value="旅遊">旅遊
<input type="checkbox" name="hobby" value="看書" checked>看書
<input type="checkbox" name="hobby" value="遊戲">遊戲<br>
自我介紹:<textarea name="intro"></textarea><br>
<input type="submit" value="提交">
</form>
<%@ page contentType="text/html;charset=UTF-8" %>
<% request.setCharacterEncoding("UTF-8"); // 必須在 getParameter 前 %>
<html><body>
您的姓名:<%= request.getParameter("name") %><br>
您的密碼:<%= request.getParameter("pwd") %><br>
您的職業:<%= request.getParameter("career") %><br>
喜歡城市:<%= request.getParameter("city") %><br>
您的愛好:
<%
String[] hobbies = request.getParameterValues("hobby");
if (hobbies != null) {
for (String h : hobbies) out.print(h + " ");
}
%><br>
自我介紹:<%= request.getParameter("intro") %>
</body></html>
request.setCharacterEncoding("UTF-8") 在第一次 getParameter 前調用。server.xml <Connector URIEncoding="UTF-8"/>。CharacterEncodingFilter 統一攔截所有請求設定編碼,Spring Boot 已內建。public String getRealIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// X-Forwarded-For 可能多級代理,取第一個非 unknown
return ip.split(",")[0].trim();
}
@PostMapping("/api/user")
public ResponseEntity<String> createUser(HttpServletRequest request) throws IOException {
StringBuilder sb = new StringBuilder();
try (BufferedReader br = request.getReader()) {
String line;
while ((line = br.readLine()) != null) sb.append(line);
}
User user = new ObjectMapper().readValue(sb.toString(), User.class);
// 處理業務...
return ResponseEntity.ok("OK");
}
最佳實踐:Spring MVC 直接用 @RequestBody User user 自動反序列化,無需手動讀流。
HttpServletRequest 是 Servlet 規範核心,熟練掌握參數獲取、編碼設置、Header/Cookie/Session 操作、請求體讀取,並配合 Filter 統一處理跨領域關注點 (編碼、日誌、權限、IP),是扎實 Java Web 基礎的關鍵。