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

Java Web 開發中 HttpServletRequest 核心方法詳解與實戰範例

     編輯:Java 相關知識

前言

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()StringHTTP 方法 (GET/POST/PUT...)REST 風格判斷
getRequestURI() / getRequestURL()String請求路徑 (不含/含域名)權限攔截、日誌記錄
getRemoteAddr()String客戶端 IP (注意反向代理需讀 X-Forwarded-For)風控、地域限制
getInputStream() / getReader()InputStream / BufferedReader讀取原始請求體 (JSON、XML)REST API 接收 JSON

二、實戰範例:用戶註冊表單處理

2.1 前端頁面 (zhuce.html)

<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>

2.2 後端處理 (zhuce.jsp)

<%@ 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>

三、進階技巧與避坑指南

3.1 亂碼終極解決方案

  1. POST:request.setCharacterEncoding("UTF-8") 在第一次 getParameter 前調用。
  2. GET:Tomcat 8+ 預設 UTF-8;舊版需在 server.xml <Connector URIEncoding="UTF-8"/>。
  3. Filter 方案:編寫 CharacterEncodingFilter 統一攔截所有請求設定編碼,Spring Boot 已內建。

3.2 獲取真實客戶端 IP (反向代理環境)

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();
}

3.3 讀取 JSON 請求體 (REST API)

@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 基礎的關鍵。

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