HttpServletResponse源碼解析

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

🧩 一、作用概述

HttpServletResponseServletResponse 的子接口,專門用于處理 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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84598.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84598.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84598.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI基礎概念

目錄 1、ASR和STT區別 2、流式輸出 定義 原理 應用場景 優點 缺點 3、Ollama 4、mindspore和deepseek r1 v3 5、DeepSeek R1/V3 用的哪個底層AI框架 6、HAI-LLM比tensorflow、pytorch還強么 1. 核心優勢對比 2. 性能表現 3. 適用場景 總結 7、openai用的什么底層…

ubuntu20.04速騰聚創airy驅動調試

1.下載相關資料 下載包括&#xff1a;速騰airy產品手冊.pdf、RSView&#xff08;用于顯示激光雷達數據&#xff09;、3d數模文件、 RS-LiDAR-16用戶手冊 以下鏈接進行下載 https://www.robosense.cn/resources 2.連接線路后通過Wireshark抓包后進行本地IP配置 2.1按照線路連…

Redis的大key和熱key如何解決

文章目錄 Redis大Key一、什么是Redis大Key二、大Key的產生原因三、大Key的影響四、大Key的解決方案1. 檢測大Key2. 解決方案(1) 數據拆分(2) 使用壓縮算法(3) 使用合適的數據結構(4) 設置合理的過期時間(5) 合理清理(6) 配置優化 五、預防措施總結 Redis熱key一、熱Key問題的本…

恒溫晶振與溫補晶振的區別

在電子設備領域&#xff0c;晶振如同精準的“心臟起搏器”&#xff0c;為電路提供穩定的時鐘信號。恒溫晶振&#xff08;OCXO&#xff09;和溫補晶振&#xff08;TCXO&#xff09;作為兩類重要的晶體振蕩器&#xff0c;在不同的應用場景中發揮著關鍵作用&#xff0c;它們的區別…

基于SpringBoot的在線考試智能監控系統設計與實現

目錄 一.&#x1f981;前言二.&#x1f981;開源代碼與組件使用情況說明三.&#x1f981;核心功能1. ?算法設計2. ?Java開發語言3. ?Vue.js框架4. ?部署項目 四.&#x1f981;演示效果1. 管理員模塊1.1 用戶管理 2. 教師模塊2.1 考試管理2.2 瀏覽試題列表2.3 添加試題2.4 成…

0基礎學Python系列【16】自動化郵件發送的終極教程:Python庫smtplib與email詳解

大家好,歡迎來到Python學習的第二站!?? Python自帶了一些超好用的模塊,可以讓你不必從頭寫代碼就能實現很多功能。比如數學計算、文件操作、網絡通信等。花姐會挑選常用的一些模塊來講解,確保你能在實際項目中用到。?? 本章要學什么? 接下來花姐會深入淺出的講解下面…

環衛車輛定位與監管:安心聯車輛監控管理平臺--科技賦能城市環境衛生管理

一、 引言 城市環境衛生是城市文明的重要標志&#xff0c;也是城市管理的重要內容。隨著城市化進程的加快&#xff0c;環衛作業范圍不斷擴大&#xff0c;環衛車輛數量不斷增加&#xff0c;傳統的管理模式已難以滿足現代化城市管理的需求。為提高環衛作業效率&#xff0c;加強環…

GIS 數據質檢:驗證 Geometry 有效性

前言 在GIS開發中&#xff0c;數據的幾何有效性直接影響分析結果的準確性。無效的幾何&#xff08;如自相交、空洞或坐標錯誤&#xff09;可能導致空間計算失敗或輸出偏差。無論是Shapefile、GeoJSON還是數據庫中的空間數據&#xff0c;幾何質檢都是數據處理中不可忽視的關鍵步…

AI大模型學習之基礎數學:高斯分布-AI大模型概率統計的基石

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

HarmonyOS性能優化——耗時操作減少

耗時操作減少 在應用開發中&#xff0c;避免主線程執行冗余和耗時操作至關重要。這可以降低主線程負載&#xff0c;提升UI響應速度。 避免主線程冗余操作 冗余操作是不必要的、重復執行且對程序功能無實質性貢獻的操作。這些操作浪費計算資源&#xff0c;降低程序運行效率&a…

emscripten 編譯 wasm 版本的 openssl

搭建emscripten環境【參考&#xff1a;https://emscripten.org/docs/getting_started/downloads.html】 下載openssl解壓復制到emsdk目錄 依次執行下列命令&#xff1a; cd emsdk #激活emsdk source ./emsdk_env.shcd opensslemconfigure ./Configure linux-x32 -no-asm -sta…

uniapp 實戰新聞頁面(一)

新聞系統 一、 創建項目 創建個人中心 page.json 配置 tabar "tabBar": {"color":"#666","selectedColor": "#31C27C","list": [{"text": "首頁","pagePath": "pages/inde…

JAVA鎖機制:對象鎖與類鎖

JAVA鎖機制&#xff1a;對象鎖與類鎖 在多線程編程中&#xff0c;合理使用鎖機制是保證數據一致性和線程安全的關鍵。本文將通過示例詳細講解 Java 中的對象鎖和類鎖的原理、用法及區別。 一、未加鎖的并發問題 先看一段未加鎖的代碼&#xff1a; public class Synchronize…

maxcomputer 和 hologres中的EXTERNAL TABLE 和 FOREIGN TABLE

在阿里云的大數據和實時數倉產品中&#xff0c;MaxCompute 和 Hologres 都支持類似于 EXTERNAL TABLE 和 FOREIGN TABLE 的機制&#xff0c;但它們的實現和語義有所不同。 下面分別說明&#xff1a; ?? 一、MaxCompute 中的 EXTERNAL TABLE 和 FOREIGN TABLE 1. EXTERNAL T…

穩定幣:從支付工具到金融基礎設施的技術演進與全球競爭新格局

引言&#xff1a;穩定幣的崛起與金融體系重構 2025年6月&#xff0c;全球穩定幣市值突破2500億美元歷史大關&#xff0c;單年鏈上交易額高達35萬億美元——這一數字已超越Visa和萬事達卡交易總和。這一里程碑事件標志著穩定幣已從加密貨幣市場的邊緣實驗&#xff0c;蛻變為重構…

用 HTML、CSS 和 jQuery 打造多頁輸入框驗證功能

多頁輸入框驗證功能總結:使用 HTML、CSS 和 jQuery 實現 一、多頁表單驗證的核心概念與應用場景 多頁輸入框驗證是指將復雜表單拆分為多個頁面或步驟,逐步引導用戶完成輸入,并在每一步對用戶輸入進行驗證的功能。這種設計具有以下優勢: 提升用戶體驗:避免長表單帶來的心…

DeepSpeed 深度學習學習筆記:高效訓練大型模型

主要參考官網文檔&#xff0c;對于具體內容還需參考官方文檔 1. 引言&#xff1a;為什么需要 DeepSpeed&#xff1f; 大型模型訓練的挑戰 隨著深度學習模型規模的爆炸式增長&#xff08;從 BERT 的幾億參數到 GPT-3 的千億參數&#xff0c;再到現在的萬億參數模型&#xff09…

編程基礎:耦合

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 耦合&#xff1a;功能的單一性&#xff0c;功能越拆分則單一功能越好維護 耦合&#xff1a;功能的單一性&#xff0c;功能越拆分則單一功能越好維護

基于Qt的UDP主從服務器設計與實現

概述 一個基于Qt框架實現的UDP主從服務器系統&#xff0c;該系統具備自動主機選舉、故障轉移和狀態同步等關鍵功能&#xff0c;適用于分布式能源管理系統中的設備通信與協調。 系統核心功能 1. 自動主機選舉與故障轉移 系統通過優先級機制實現自動主機選舉&#xff0c;當主機…

【51單片機2位數碼管100毫秒的9.9秒表】2022-5-16

緣由 這一題剛設計好要去回復就看到結帖了&#xff0c;好似看到我設計完成就盜竊去了&#xff0c;如此下面類似題目很容易也懶得回復了。 #include "reg52.h" sbit k0P3^0; sbit k1P3^1; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111};//0-9 uns…