HttpServletResponse 對象用來做什么?

HttpServletResponse 對象是由 Servlet 容器創建并傳遞給 Servlet 的 service() 方法(以及間接傳遞給 doGet(), doPost() 等方法)的。它的核心作用是讓 Servlet 能夠向客戶端(通常是瀏覽器)發送 HTTP 響應

通過 HttpServletResponse 對象,我們可以:

  1. 設置響應狀態碼 (Status Code)
  2. 設置響應頭 (Headers)
  3. 設置 Cookie
  4. 寫入響應體 (Response Body),即發送內容回瀏覽器

下面我們詳細看看如何進行這些操作:


1. 設置響應狀態碼 (Status Code)

狀態碼告訴瀏覽器請求的處理結果(例如,成功、未找到、服務器錯誤等)。

  • 方法:

    • response.setStatus(int sc): 設置指定的 HTTP 狀態碼。
    • response.sendError(int sc): 發送一個指定的狀態碼給客戶端(通常會附帶一個簡單的錯誤頁面)。
    • response.sendError(int sc, String msg): 發送一個指定的狀態碼和一條錯誤消息給客戶端。
    • response.sendRedirect(String location): 發送一個重定向響應 (狀態碼 302) 到指定的 URL。
  • 常量: javax.servlet.http.HttpServletResponse 接口定義了很多常用的狀態碼常量,例如:

    • HttpServletResponse.SC_OK (200)
    • HttpServletResponse.SC_CREATED (201)
    • HttpServletResponse.SC_NO_CONTENT (204)
    • HttpServletResponse.SC_MOVED_PERMANENTLY (301)
    • HttpServletResponse.SC_FOUND (302) - sendRedirect 默認使用這個
    • HttpServletResponse.SC_BAD_REQUEST (400)
    • HttpServletResponse.SC_UNAUTHORIZED (401)
    • HttpServletResponse.SC_FORBIDDEN (403)
    • HttpServletResponse.SC_NOT_FOUND (404)
    • HttpServletResponse.SC_INTERNAL_SERVER_ERROR (500)
  • 示例:

    // 設置成功狀態碼
    response.setStatus(HttpServletResponse.SC_OK);// 如果資源未找到
    // response.sendError(HttpServletResponse.SC_NOT_FOUND, "The requested resource was not found.");// 重定向到另一個頁面
    // response.sendRedirect("http://www.example.com/newPage");
    

    注意: 設置狀態碼或調用 sendError/sendRedirect 應該在向響應體寫入任何內容 之前 進行。


2. 設置響應頭 (Headers)

響應頭包含關于響應的元數據,例如內容類型、緩存控制、自定義信息等。

  • 方法:

    • response.setHeader(String name, String value): 設置一個具有給定名稱和值的頭。如果該頭已存在,則新值將覆蓋舊值。
    • response.addHeader(String name, String value): 添加一個具有給定名稱和值的頭。允許同一個頭名稱有多個值。
    • response.setContentType(String type): 設置響應內容的 MIME 類型(例如 “text/html”, “application/json”, “image/jpeg”)。這實際上是設置 Content-Type 頭的一個便捷方法。
    • response.setCharacterEncoding(String charset): 設置發送到客戶端的響應的字符編碼(例如 “UTF-8”)。通常與 setContentType 一起使用,或者直接在 setContentType 中指定,如 response.setContentType("text/html; charset=UTF-8");
    • response.setContentLength(int len) / response.setContentLengthLong(long len): 設置響應體的長度(以字節為單位)。
  • 示例:

    // 設置內容類型為 HTML,并使用 UTF-8 編碼
    response.setContentType("text/html; charset=UTF-8");
    // 或者分兩步:
    // response.setContentType("text/html");
    // response.setCharacterEncoding("UTF-8");// 設置自定義頭
    response.setHeader("X-Custom-Info", "This is my custom header value");// 設置緩存控制,禁止緩存
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0
    response.setDateHeader("Expires", 0); // Proxies// 如果你知道響應體的確切字節數
    // byte[] responseBodyBytes = ...;
    // response.setContentLength(responseBodyBytes.length);
    

    注意: 設置響應頭也應該在向響應體寫入任何內容 之前 進行。


3. 設置 Cookie

Cookie 是服務器發送到用戶瀏覽器并保存在本地的一小塊數據,它們會在瀏覽器下次向同一服務器發起請求時被攜帶并發送到服務器上。

  • 步驟:

    1. 創建一個 javax.servlet.http.Cookie 對象。
    2. 可選地,設置 Cookie 的屬性 (如過期時間 setMaxAge(), 路徑 setPath(), 域 setDomain(), 安全性 setSecure(), setHttpOnly(), setSameSite())。
    3. 使用 response.addCookie(Cookie cookie) 將 Cookie 添加到響應中。這會生成一個 Set-Cookie 響應頭。
  • 示例:

    // 創建一個新的 Cookie
    Cookie userCookie = new Cookie("username", "john_doe");// 設置 Cookie 的有效期為 1 小時 (3600 秒)
    userCookie.setMaxAge(3600);// 設置 Cookie 的路徑,使其對整個應用可見
    userCookie.setPath(request.getContextPath() + "/"); // 或者簡單地 "/"// (可選) 設置為 HttpOnly,防止 JavaScript 訪問,增強安全性
    userCookie.setHttpOnly(true);// (可選) 設置為 Secure,僅通過 HTTPS 傳輸
    // userCookie.setSecure(true);// (可選,現代瀏覽器推薦) 設置 SameSite 屬性
    // userCookie.setSameSite("Lax"); // 或 "Strict" 或 "None" (None 需要 Secure=true)// 將 Cookie 添加到響應中
    response.addCookie(userCookie);// 刪除一個 Cookie (通過設置 maxAge 為 0)
    // Cookie deleteCookie = new Cookie("old_cookie_name", "");
    // deleteCookie.setMaxAge(0);
    // deleteCookie.setPath("/");
    // response.addCookie(deleteCookie);
    

    注意: 添加 Cookie 也是通過設置響應頭 (Set-Cookie) 實現的,所以也應該在向響應體寫入任何內容 之前 進行。


4. 將內容發送回瀏覽器 (寫入響應體)

一旦狀態碼和頭信息設置完畢,你就可以開始向響應體寫入實際內容了。你有兩種方式獲取輸出流:

  • response.getWriter(): 返回一個 java.io.PrintWriter 對象,用于發送字符文本數據 (如 HTML, XML, JSON, plain text)。
    • 在使用 getWriter() 之前,應該先通過 response.setContentType() 和/或 response.setCharacterEncoding() 設置正確的字符編碼。
  • response.getOutputStream(): 返回一個 javax.servlet.ServletOutputStream 對象,用于發送二進制數據 (如圖片, PDF, ZIP 文件)。

重要: 你在一個響應中只能調用 getWriter()getOutputStream() 一次。調用其中一個后,就不能再調用另一個了,否則會拋出 IllegalStateException

  • 示例 (使用 PrintWriter 發送 HTML):

    response.setContentType("text/html; charset=UTF-8");
    // response.setStatus(HttpServletResponse.SC_OK); // 默認是 200 OK,可以不顯式設置PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE html>");
    out.println("<html>");
    out.println("<head>");
    out.println("<meta charset=\"UTF-8\">");
    out.println("<title>My Servlet Response</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Hello from Servlet!</h1>");
    out.println("<p>This is a dynamic response.</p>");
    out.println("</body>");
    out.println("</html>");
    // out.flush(); // 可選,容器通常會自動 flush
    // out.close(); // 可選,容器通常會自動關閉
    
  • 示例 (使用 ServletOutputStream 發送圖片 - 假設 imageData 是一個 byte[]):

    // byte[] imageData = ... ; // 從文件或數據庫加載圖片數據// response.setContentType("image/jpeg");
    // response.setContentLength(imageData.length);
    // // response.setStatus(HttpServletResponse.SC_OK);// ServletOutputStream sos = response.getOutputStream();
    // sos.write(imageData);
    // sos.flush();
    // sos.close();
    

完整示例 (一個簡單的 Servlet):

package com.example;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 1. 設置狀態碼 (默認是 200 OK,如果一切正常,可以不顯式設置)response.setStatus(HttpServletResponse.SC_OK);// 2. 設置響應頭response.setContentType("text/html; charset=UTF-8");response.setHeader("X-Server-Time", new Date().toString());// 3. 設置 CookieCookie visitCookie = new Cookie("lastVisit", String.valueOf(System.currentTimeMillis()));visitCookie.setMaxAge(60 * 60 * 24 * 7); // 7 daysvisitCookie.setPath(request.getContextPath() + "/");visitCookie.setHttpOnly(true);response.addCookie(visitCookie);// 4. 獲取 PrintWriter 并寫入響應體// (注意:一旦調用 getWriter() 或 getOutputStream(),響應頭就被認為是“已提交”,不能再修改狀態碼或頭信息)PrintWriter out = response.getWriter();out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<meta charset=\"UTF-8\">");out.println("<title>Servlet Response</title>");out.println("</head>");out.println("<body>");out.println("<h1>Hello, World from Servlet!</h1>");out.println("<p>Welcome! Your request was processed successfully.</p>");out.println("<p>Check your browser's developer tools for the 'X-Server-Time' header and the 'lastVisit' cookie.</p>");out.println("</body>");out.println("</html>");// 通常不需要顯式調用 out.close(),因為 Servlet 容器會在請求處理完成后自動關閉它。// 但如果是在 Filter 中或有特殊資源管理需求,可能需要。}
}

關鍵點總結:

  • 順序很重要: 設置狀態碼、響應頭和 Cookie 必須在第一次調用 response.getWriter()response.getOutputStream() 之前完成,或者在響應被提交(flushed)之前完成。一旦響應體開始寫入,頭信息就不能再更改了。
  • getWriter() vs getOutputStream(): 只能選擇一個,不能同時使用。
  • 字符編碼: 對于文本內容,務必設置正確的字符編碼(通常是 UTF-8)以避免亂碼問題。
  • 容器管理: Servlet 容器負責在請求處理結束后刷新和關閉輸出流。

通過這些方法,HttpServletResponse 提供了全面的控制,使 Servlet 能夠構建并發送各種類型的 HTTP 響應給客戶端。

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

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

相關文章

FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其應用場景

一、什么是FTPS&#xff1f; FTPS&#xff0c;英文全稱File Transfer Protocol with support for Transport Layer Security (SSL/TLS)&#xff0c;安全文件傳輸協議&#xff0c;是一種對常用的文件傳輸協議(FTP)添加傳輸層安全(TLS)和安全套接層(SSL)加密協議支持的擴展協議。…

前端??HTML contenteditable 屬性使用指南

??什么是 contenteditable&#xff1f; HTML5 提供的全局屬性&#xff0c;使元素內容可編輯類似于簡易富文本編輯器兼容性?? 支持所有現代瀏覽器&#xff08;Chrome、Firefox、Safari、Edge&#xff09; 移動端&#xff08;iOS/Android&#xff09;部分鍵盤行為需測試 &l…

持續領跑中國異地組網路由器市場,貝銳蒲公英再次登頂銷量榜首

作為國產遠程連接SaaS服務的創領者&#xff0c;貝銳持續引領行業發展&#xff0c;旗下貝銳蒲公英異地組網路由器&#xff0c;憑借出色的技術實力和市場表現&#xff0c;斬獲2024年線上電商平臺市場銷量份額中國第一的佳績&#xff0c;充分彰顯了其在網絡解決方案與異地組網領域…

五大主流大模型推理引擎深度解析:llama.cpp、vLLM、SGLang、DeepSpeed和Unsloth的終極選擇指南

在人工智能的競技場上,大模型推理框架就像是為超級跑車精心調校的引擎系統——選對了能讓你的AI應用一騎絕塵,選錯了可能連"停車場"都開不出去。這些框架的核心價值在于將訓練好的"大腦"轉化為實際可用的"肌肉記憶",而選擇標準則需要像職業賽…

前端面試二之運算符與表達式

目錄 1.JavaScript 中的 和 運算符 2.|| (邏輯或) 運算符 與 ES6 默認參數的區別 與 ?? (空值合并運算符) 的區別 3.?.&#xff08;可選鏈&#xff09;運算符 (1). 安全訪問深層嵌套屬性 (2). 安全調用可能不存在的函數 (3). 安全訪問數組元素 4.展開運算符 (..…

GB/T 24507-2020 浸漬紙層壓實木復合地板檢測

浸漬紙層壓實木地板是指以一層或多層專用紙浸漬熱固性氨基樹脂&#xff0c;經干燥后鋪裝在膠合板基材正面&#xff0c;專用紙表面加耐磨層&#xff0c;基材背面可加平衡層&#xff0c;經熱壓、成型的地板。 GB/T 24507-2020 浸漬紙層壓實木復合地板測試項目&#xff1a; 測試項…

AWS DocumentDB vs MongoDB:數據庫的技術抉擇

隨著非關系型數據庫在現代應用中的廣泛應用&#xff0c;文檔型數據庫因其靈活的結構與出色的擴展性&#xff0c;逐漸成為企業開發與架構設計中的核心選擇。在眾多文檔數據庫中&#xff0c;MongoDB 憑借其成熟生態與社區支持占據主導地位&#xff1b;與此同時&#xff0c;AWS 提…

微信小程序實現運動能耗計算

微信小程序實現運動能耗計算 近我做了一個挺有意思的微信小程序&#xff0c;能夠實現運動能耗的計算。只需要輸入性別、年齡、體重、運動時長和運動類型這些信息&#xff0c;就能算出對應的消耗熱量。 具體來說&#xff0c;在小程序里&#xff0c;性別不同&#xff0c;身體基…

三軸地磁傳感器的主要應用場景

隨著材料科學、微電子技術以及傳感器技術的不斷進步&#xff0c;三軸地磁傳感器的性能將不斷提升&#xff0c;包括提高精度、降低功耗、增強抗干擾能力等。 RAMSUN提供的是一款三軸地磁傳感器采用第三代AMR技術&#xff0c;帶有自動溫度補償的三軸磁傳感器&#xff0c;該產品因…

使用 SseEmitter 實現 Spring Boot 后端的流式傳輸和前端的數據接收

1.普通文本消息的發送和接收 GetMapping("/stream")public SseEmitter streamResponse() {SseEmitter emitter new SseEmitter(0L); // 0L 表示永不超時Executors.newSingleThreadExecutor().execute(() -> {try {for (int i 1; i < 5; i) {emitter.send(&q…

nssm配置springboot項目環境,注冊為windows服務

NSSM 的官方下載地址是&#xff1a;NSSM - the Non-Sucking Service Manager1 使用powershell輸入命令,java項目需要手動配置和依賴nacos .\nssm.exe install cyMinio "D:\minio\啟動命令.bat" .\nssm.exe install cyNacos "D:\IdeaProject\capacity\nacos-s…

WinCC學習系列-基礎概念

從本節起&#xff0c;學習和了解西門子最新SCADA軟件WinCC 8.0&#xff0c;將從基礎概念開始&#xff0c;到入門操作&#xff08;創建項目、組態通信、組態過程畫面、組態面板類型和變量結構、歸檔和顯示值、組態消息&#xff09;&#xff0c;到高級應用&#xff08;WinCC選件、…

數據分析圖表類型及其應用場景

說明&#xff1a;頂部HTML文件下載后可以直接查看&#xff0c;帶有示圖。 摘要 數據可視化作為現代數據分析的核心環節&#xff0c;旨在將復雜、抽象的數據轉化為直觀、易懂的圖形形式。這種轉化顯著提升了業務決策能力&#xff0c;優化了銷售與營銷活動&#xff0c;開辟了新…

《江西棒壘球》敗方mvp叫什么·棒球1號位

敗方mvp也是MVP&#xff0c;以棒球運動為例&#xff0c;MLB&#xff08;美國職棒大聯盟&#xff09;的個人獎項旨在表彰球員在不同領域的卓越表現&#xff0c;涵蓋常規賽和季后賽的杰出成就。 常規賽核心獎項 最有價值球員獎&#xff08;MVP&#xff09; 定義&#xff1a;表彰…

CD43.vector模擬實現(2)

目錄 1.拷貝構造函數 寫法1 寫法2 測試代碼 調試找bug 解決方法:修改拷貝構造函數 測試代碼 2.operator[ ] 測試代碼 1.沒有const修飾 2.有const修飾 3.insert 迭代器失效問題 承接CD42.vector模擬實現(1)文章 1.拷貝構造函數 設置start、finish和end_of_storag…

【C/C++】入門grpc的idl

文章目錄 grpc idl 簡單介紹1. 文件結構組織規范文件命名包結構&#xff1a;推薦&#xff1a;一個文件只定義一個 service&#xff0c;如果 service 很復雜&#xff0c;可拆分多個 proto 文件。 2. 消息定義規范命名風格字段編號&#xff1a;示例&#xff1a; 3. 服務與 RPC 設…

安全-JAVA開發-第二天

Web資源訪問的流程 由此可見 客戶訪問JAVA開發的應用時 會先通過 監聽器&#xff08;Listener&#xff09;和 過濾器&#xff08;Filter&#xff09; 今天簡單的了解下這兩個模塊的開發過程 監聽器&#xff08;Listener&#xff09; 主要是監聽 我們觸發了什么行為 并進行反應…

使用 Ansys Q3D 進行電容提取

精確的電容提取在高速和 RF 設計中至關重要。雖然簡單的公式可以提供一個很好的起點&#xff0c;但它們往往無法捕捉 fringing fields 和 layout-dependent parasitics 的影響。在本博客中&#xff0c;我們演示了如何使用Ansys Q3D Extractor來計算電容值&#xff0c;從基本的平…

卡西歐模擬器:Windows端功能強大的計算器

引言 大家還記得初中高中時期用的計算器嗎&#xff1f;今天給大家分享的就是一款windows端的卡西歐計算器。 軟件介紹 大家好&#xff0c;我是逍遙小歡。 CASIO fx-9860G是一款功能強大的圖形計算器&#xff0c;適用于數學、科學和工程計算。以下是其主要功能和特點的詳細介…

【Bluedroid】藍牙啟動之gatt_init 流程源碼解析

本文圍繞Android藍牙協議棧中 GATT(通用屬性配置文件)模塊的初始化函數gatt_init展開,深入解析其核心實現邏輯與關鍵步驟。通過分析gatt_init及其關聯子函數(如L2CA_RegisterFixedChannel、gatt_profile_db_init、EattExtension::Start等),以及相關數據結構(如tGATT_CB控…