Java Servlet API 中 HttpServletResponse
接口的源碼,這是 Java Web 開發中非常核心的一個接口,用于向客戶端(通常是瀏覽器)發送 HTTP 響應。
public interface HttpServletResponse extends ServletResponse {int SC_CONTINUE = 100;int SC_SWITCHING_PROTOCOLS = 101;int SC_OK = 200;int SC_CREATED = 201;int SC_ACCEPTED = 202;int SC_NON_AUTHORITATIVE_INFORMATION = 203;int SC_NO_CONTENT = 204;int SC_RESET_CONTENT = 205;int SC_PARTIAL_CONTENT = 206;int SC_MULTIPLE_CHOICES = 300;int SC_MOVED_PERMANENTLY = 301;int SC_MOVED_TEMPORARILY = 302;int SC_FOUND = 302;int SC_SEE_OTHER = 303;int SC_NOT_MODIFIED = 304;int SC_USE_PROXY = 305;int SC_TEMPORARY_REDIRECT = 307;int SC_BAD_REQUEST = 400;int SC_UNAUTHORIZED = 401;int SC_PAYMENT_REQUIRED = 402;int SC_FORBIDDEN = 403;int SC_NOT_FOUND = 404;int SC_METHOD_NOT_ALLOWED = 405;int SC_NOT_ACCEPTABLE = 406;int SC_PROXY_AUTHENTICATION_REQUIRED = 407;int SC_REQUEST_TIMEOUT = 408;int SC_CONFLICT = 409;int SC_GONE = 410;int SC_LENGTH_REQUIRED = 411;int SC_PRECONDITION_FAILED = 412;int SC_REQUEST_ENTITY_TOO_LARGE = 413;int SC_REQUEST_URI_TOO_LONG = 414;int SC_UNSUPPORTED_MEDIA_TYPE = 415;int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;int SC_EXPECTATION_FAILED = 417;int SC_INTERNAL_SERVER_ERROR = 500;int SC_NOT_IMPLEMENTED = 501;int SC_BAD_GATEWAY = 502;int SC_SERVICE_UNAVAILABLE = 503;int SC_GATEWAY_TIMEOUT = 504;int SC_HTTP_VERSION_NOT_SUPPORTED = 505;void addCookie(Cookie var1);boolean containsHeader(String var1);String encodeURL(String var1);String encodeRedirectURL(String var1);/** @deprecated */@DeprecatedString encodeUrl(String var1);/** @deprecated */@DeprecatedString encodeRedirectUrl(String var1);void sendError(int var1, String var2) throws IOException;void sendError(int var1) throws IOException;void sendRedirect(String var1) throws IOException;void setDateHeader(String var1, long var2);void addDateHeader(String var1, long var2);void setHeader(String var1, String var2);void addHeader(String var1, String var2);void setIntHeader(String var1, int var2);void addIntHeader(String var1, int var2);void setStatus(int var1);/** @deprecated */@Deprecatedvoid setStatus(int var1, String var2);int getStatus();String getHeader(String var1);Collection<String> getHeaders(String var1);Collection<String> getHeaderNames();default void setTrailerFields(Supplier<Map<String, String>> supplier) {}default Supplier<Map<String, String>> getTrailerFields() {return null;}
}
🧩 一、作用概述
HttpServletResponse
是 ServletResponse
的子接口,專門用于處理 HTTP 協議的響應內容。在 Servlet 中,當服務器收到請求后,會創建一個 HttpServletRequest
對象封裝請求信息,同時也會創建一個 HttpServletResponse
對象來構建響應內容。
開發者可以通過這個對象:
- 設置響應狀態碼
- 添加響應頭(Headers)
- 寫入響應體(Body)
- 發送重定向
- 添加 Cookie 等
📌 二、主要常量:HTTP 狀態碼
該接口定義了大量常用的 HTTP 狀態碼常量,方便開發者直接使用,例如:
狀態碼常量 | 含義 |
---|---|
SC_OK (200) | 請求成功 |
SC_FOUND (302) | 臨時重定向 |
SC_NOT_FOUND (404) | 資源未找到 |
SC_INTERNAL_SERVER_ERROR (500) | 服務器內部錯誤 |
SC_FORBIDDEN (403) | 拒絕訪問 |
SC_UNAUTHORIZED (401) | 未授權 |
這些狀態碼可以直接通過 response.setStatus(HttpServletResponse.SC_OK);
來設置。
🛠? 三、常用方法詳解
1. 設置響應狀態碼
void setStatus(int sc);
設置響應的狀態碼,比如 200、404 等。
?? 注意:setStatus(int, String)
方法已被廢棄。
2. 發送錯誤響應
void sendError(int sc) throws IOException;
void sendError(int sc, String msg) throws IOException;
發送錯誤狀態碼給客戶端,并可選地附帶錯誤消息。
示例:
response.sendError(HttpServletResponse.SC_NOT_FOUND, "資源不存在");
3. 重定向
void sendRedirect(String location) throws IOException;
讓瀏覽器跳轉到新的 URL(會發起一個新的請求)。
示例:
response.sendRedirect("http://example.com");
4. 添加/設置響應頭
void setHeader(String name, String value);
void addHeader(String name, String value);
void setDateHeader(String name, long date);
void setIntHeader(String name, int value);
setHeader()
:覆蓋已有的 header。addHeader()
:追加 header(可以有多個相同名稱的 header)。
示例:
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.setIntHeader("Refresh", 5); // 每5秒刷新一次頁面
5. 添加 Cookie
void addCookie(Cookie cookie);
示例:
Cookie cookie = new Cookie("user", "Tom");
cookie.setMaxAge(60 * 60 * 24); // 一天有效期
response.addCookie(cookie);
6. URL 編碼(用于會話跟蹤)
String encodeURL(String url);
String encodeRedirectURL(String url);
用于對 URL 進行編碼,以支持 Session ID 的追蹤(如 Cookie 被禁用時)。
示例:
String encodedUrl = response.encodeURL("index.jsp");
?? 已廢棄的方法:
@Deprecated
String encodeUrl(String url);
String encodeRedirectUrl(String url);
7. 獲取和設置 Trailer Fields(HTTP 1.1 分塊傳輸尾部字段)
default void setTrailerFields(Supplier<Map<String, String>> supplier) {}
default Supplier<Map<String, String>> getTrailerFields() { return null; }
用于在分塊傳輸(chunked transfer)結束后發送一些額外的頭部信息(trailer headers),但實際使用較少。
8. 檢查是否已經包含某個 Header
boolean containsHeader(String name);
返回當前響應是否已經設置了指定名稱的 header。
📁 四、常見使用場景舉例
? 場景 1:返回 JSON 數據
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("application/json;charset=UTF-8");PrintWriter out = response.getWriter();out.print("{\"message\": \"Hello World\"}");
}
? 場景 2:重定向到另一個頁面
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.sendRedirect("/success.html");
}
? 場景 3:下載文件
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=\"test.txt\"");// 寫入文件內容到輸出流OutputStream out = response.getOutputStream();out.write("This is the file content".getBytes());out.flush();
}
📚 五、與 Spring MVC 的關系
在 Spring MVC 中,雖然我們很少直接操作 HttpServletResponse
,但底層依然是基于它實現的。Spring 提供了更高層的抽象,如:
@ResponseBody
ResponseEntity<T>
HttpServletResponse
作為控制器方法參數傳入
例如:
@GetMapping("/data")
public ResponseEntity<String> getData() {return ResponseEntity.ok("Hello");
}
或者:
@GetMapping("/download")
public void downloadFile(HttpServletResponse response) throws IOException {response.setContentType("application/pdf");response.setHeader("Content-Disposition", "attachment; filename=file.pdf");// 寫入 PDF 文件內容到 response.getOutputStream()
}
🔐 六、注意事項
項目 | 建議 |
---|---|
不要多次調用 getWriter() 和 getOutputStream() | 兩者不能共用,否則拋出 IllegalStateException |
設置 ContentType 應該盡早 | 防止亂碼問題 |
避免在異步或過濾器鏈中提前提交響應 | 否則后續邏輯將無法執行 |
sendRedirect 之后應 return | 避免繼續執行代碼造成異常 |
🧠 總結
HttpServletResponse
是 Java Web 開發中控制 HTTP 響應的核心接口,掌握它可以讓我們更靈活地處理以下內容:
- 返回數據(JSON、HTML、文件等)
- 控制瀏覽器行為(重定向、緩存、刷新)
- 安全控制(設置 Headers、Cookie)