Javaweb - 10.6 請求轉發和響應重定向

目錄

概述

請求轉發

邏輯圖

測試代碼

總結

響應重定向

邏輯圖

測試代碼

總結

完!


概述

什么是請求轉發和響應重定向?

? ? ? ? 請求轉發和響應重定向,是 web 應用中,間接訪問項目資源的兩種手段,也是 Servlet 控制頁面跳轉的兩種手段

? ? ? ? 請求轉發:通過 HTTPServletRequest 實現

? ? ? ? 響應重定向:通過 HttpServletResoponse 實現

? ? ? ? 舉個栗子:

? ? ? ? ? ? ? ? 請求轉發:A 找 B 借錢,B 沒有,B 找到 C,讓 C 直接把錢打到了 A 的賬戶上,A 只知道自己找到 B 借錢~

? ? ? ? ? ? ? ? 響應重定向:A 找 B 借錢,B 沒有,B 告訴 A,你去找 ,A 又找到 C,C 把錢借給了 A~

請求轉發

邏輯圖

客戶端通過 HTTP 協議,向部署在 Tomcat 服務器上的 app 應用,發送了請求(比如訪問某個 url),Tomcat 接收到請求后,會將請求報文,封裝為 HttpServletRequest 對象(即圖中的 request),同時 Tomcat 也會創建 HttpServletResponse 對象(即圖中的 response)用于后續處理響應

Tomcat 根據 request 中的 url,匹配 app 中對應的 Servlet(圖中的 ServletA),將 request 和 response 傳遞給 ServletA 進行處理。

在 ServletA 處理過程中,通過請求轉發的機制(調用 request.getRequestDispatcher("目標路徑").forward(request, response)),把當前的 request 和 response 轉交給 ServletB 繼續處理。(注意!!! 這一步過程中,是在服務器內部完成的,客戶端完全感知不到~ 整個過程屬于同一次 HTTP 請求)

ServletB 拿到 ServletA 傳來的 resquest 和 response 后,執行自己的業務,最終再通過 response 組裝響應報文

Tomcat 將響應報文相應給客戶端~

總結:一次請求,多個 Servlet 接力處理,最后統一相依~

測試代碼

代碼還需要像之前,添加 Tomcat 依賴,項目組件,設置 Tomcat 依賴~ 此處省略~

package com.zzz.servlet;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/06  21:30* @description: 測試請求轉發*/
@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletA 執行了~");// 請求轉發給 ServletB// 獲得請求轉發器RequestDispatcher requestDispatcher = req.getRequestDispatcher("servletB");// 讓請求轉發器做出轉發動作requestDispatcher.forward(req,resp);}
}
package com.zzz.servlet;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/06  21:30* @description: 測試請求轉發*/
@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletB 執行了~");}
}

請求轉發也可以攜帶參數數據過去~

package com.zzz.servlet;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/06  21:30* @description: 測試請求轉發*/
@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletA 執行了~");String money = req.getParameter("money");System.out.println("servletA 獲得參數 money = " + money);// 請求轉發給 ServletB// 獲得請求轉發器RequestDispatcher requestDispatcher = req.getRequestDispatcher("servletB");// 讓請求轉發器做出轉發動作requestDispatcher.forward(req,resp);}
}
package com.zzz.servlet;import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/06  21:30* @description: 測試請求轉發*/
@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("ServletB 執行了~");String money = req.getParameter("money");System.out.println("servletB 獲得參數 money = " + money);}
}

請求轉發,除了能從 servletA 中轉發到 servletB 外,還能轉發到靜態頁面下,還能轉發到 WEB-INF 下面的保護資源!!!

但是,不能直接在 forward 中跳轉到項目外的完整的 URL 地址中

總結

? ? ? ? 1. 請求轉發是通過 HttpServletRequest 對象獲取請求轉發器實現的

? ? ? ? 2. 請求轉發是服務器內部的行為,對客戶端是屏蔽的

? ? ? ? 3. 客戶端只發送了一次請求,即,客戶端地址欄不變

? ? ? ? 4. 服務端只產生了一對請求和響應對象(request 和 response),這一對請求和響應對象,會繼續傳遞給下一個資源

? ? ? ? 5. 因為全程只有一個 HttpServletRequest 對象,所以請求中的參數可以傳遞,請求域中的數據也可以傳遞

? ? ? ? 6. 請求轉發可以轉發給其他的 Servlet 動態資源,也可以轉發給一些靜態資源,以實現頁面跳轉

? ? ? ? 7. 請求轉發可以轉發給 WEB-INF 下受保護的資源

? ? ? ? 8. 請求轉發不能轉發到本項目以外的其他外部資源

~~~

響應重定向

邏輯圖

第一次交互:客戶端 -> ServletA(觸發重定向)

? ? ? ? 1. 客戶端發請求:

? ? ? ? 客戶端先發起第一次 HTTP 請求(比如訪問 ServletA 的URL),Tomcat 接收到后,創建 request(請求對象,封裝請求數據)和 response(響應對象,用于構建返回給客戶端的內容),并將這兩個對象傳遞給 ServletA 處理

? ? ? ? 2. ServletA 處理 & 觸發重定向

? ? ? ? ServletA 中編寫重定向邏輯(response.sendRedirect("Servlet 的 URL"))。執行后,Tomcat 會通過 response 給客戶端發送一個 3xx(如 302 )的狀態碼,同時在響應頭中帶上 Location:ServletB 的 URL,告訴客戶端,讓客戶端去新的地址重新發送請求。

第二次交互:客戶端 -> ServletB(重定向后的新請求)

? ? ? ? 3. 客戶端自動發起新請求:

? ? ? ? 客戶端(瀏覽器)受到 302 的響應后,自動發起第二次 HTTP 請求,目標就是 Location 里的 ServletB 的地址。此時,Tomcat 再次創建新的 request 和 response,傳遞給 ServletB 處理

? ? ? ? 4. ServletB 處理 & 返回響應

? ? ? ? ServletB 處理業務邏輯,通過 response 構建實際的響應內容,Tomcat 將響應返回給客戶端。

理解:為什么叫“重定向”

? ? ? ? 兩次獨立請求:重定向涉及到 客戶端發起的兩次 HTTP 請求,第一次是根據輸入的 URL 到 ServletA,第二次則是自動到 ServletB,兩次請求的 request / response 完全獨立~(數據完全不共享~)

? ? ? ? 客戶端可見跳轉:因為是瀏覽器自動發起新請求,地址欄 URL 會變成 ServletB 的地址,用戶可以直觀的看到“跳轉”過程。

總結:

? ? ? ? 重定向就是”讓客戶端換個地址重新請求“的過程,通過 Tomcat 轉發響應指令(302 + Location),由瀏覽器自動觸發第二次請求。

? ? ? ? 對比請求轉發(一次請求,服務器內部調度),重定向更強調“客戶端參與,兩次請求”。

測試代碼

package com.zzz.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/07  00:14* @description:*/
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 接收用戶請求System.out.println("Servlet1 執行了");// 響應重定向 設置響應狀態碼為 302 同時設置 Location 響應頭resp.sendRedirect("servlet2");
//        resp.sendRedirect("a.html");
//        resp.sendRedirect("/WEB-INF/b.html");
//        resp.sendRedirect("https://www.baidu.com");}
}
package com.zzz.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;/** @author zzr* @date: 2025/07/07  00:15* @description:*/
@WebServlet("/servlet2")
public class Servlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("servlet2 執行了");}
}

?響應重定向,無法將參數攜帶過去,無法訪問 WEB-INF 下的資源,但目標資源可以是外部資源完整 URL

總結

? ? ? ? 1. 響應重定向通過 HttpServletResponse 對象的 sendRedirect 方法實現

? ? ? ? 2. 響應重定向是服務端通過 302 響應碼和路徑,告訴客戶端自己去找資源,是在服務端的挺行下的客戶端的行為

? ? ? ? 3. 客戶端至少發送了兩次請求,客戶端的地址欄會發生變化

? ? ? ? 4. 服務端產生了多對請求和響應對象(request 和 response),且請求和響應對象并不會傳遞給下一個資源

? ? ? ? 5. 全程產生了多個 HttpServletRequet 對象,所以請求參數不可以傳遞,請求域中的數據也不可以傳遞

? ? ? ? 6. 重定向可以是其他 Sevlet 動態資源,也可以是一些靜態資源以實現頁面跳轉

? ? ? ? 7. 重定向不可以訪問 WEB-INF 中保護的資源

? ? ? ? 8. 重定向可以到本項目外的外部資源

~~~

補充:當兩種方式都能實現請求跳轉的時候,我們一般優先使用響應重定向!

完!

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

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

相關文章

severb

題目一 解決方法: 題目二: 解決方法: 題目三: xfs: ext: 題目四: 解決方法: fdisk中命令:n(新建) 主分區 、id、起始塊都為默認、結束塊為756M t…

Hbase2.6.2集群部署(最新版)

配套版本安裝: Hadoop 3.4.1 Zookeeper3.9.3 Hbase2.6.2 前置安裝 Linux環境下部署Zookeeper3.9.3(最新版)集群部署-CSDN博客 Linux環境下Hadoop3.4.1(最新版本)集群部署-CSDN博客 一、文件解壓 cd /usr/local/soft/ tar -zxvf hbase-2.6.2-bin.tar.gz 二、修改啟…

IDEA-安裝IDEA開發工具

目錄 一.從官網獲取安裝包 二.進行安裝 三.首次運行IDEA 四.創建Java項目,檢測是否運行成功 一.從官網獲取安裝包 IDEA官網https://www.jetbrains.com/idea/ IDEA是分為免費的社區版和付費的最終版的,這里強烈建議使用付費的最終版,免費社…

房屋結構安全監測系統:技術架構與應用解析

政策背景:制度驅動下的安全升級??近年來,國家層面密集出臺多項房屋安全管理政策,為智能化監測技術提供了明確的制度支撐和發展方向:專項整治要求:國務院《全國自建房安全專項整治作方案》明確提出“用3年左右時間完成…

goole chrome變更默認搜索引擎為百度

找到瀏覽器的設置點擊設置跳轉到設置頁面點擊此頁面的 【搜索引擎】欄點擊【管理搜索引擎和網站搜索】設置搜索引擎 網址格式http://www.baidu.com/s?wd%s&ie{inputEncoding}

萬物智聯時代啟航:鴻蒙OS重塑全場景開發新生態

目錄 HarmonyOS簡介:分布式操作系統,開啟萬物智聯新時代 HarmonyOS發展歷程:從破局到引領 核心特性:分布式技術三支柱 應用場景:全場景覆蓋的鴻蒙生態 什么選擇鴻蒙開發?技術紅利與市場藍海 結語&…

LangChain4j 系統化知識學習筆記(接入模型、AiService、持久化記憶、增強RAG)

文章目錄前言一、認識**LangChain4j**1.1、歷史背景1.2、主要功能1.3、場景二、SpringBoot接入大模型2.1、項目基本配置 & pom引入依賴2.2、接入大模型2.2.1、**LangChain4j** 庫結構2.2.2、引入LangChain4j相關依賴2.2.3、補充LangChain4j單測來驗證與gpt交互2.3、整合lan…

什么是時序數據庫?——原理、特點與應用

在大數據和物聯網時代,數據的產生速度和數量都在飛速增長。尤其是在工業監控、金融分析、物聯網等領域,數據往往以“時間序列”的形式不斷產生。為了高效地存儲和分析這類數據,時序數據庫(Time Series Database,簡稱TS…

FastAPI+React19 ERP系統實戰 第01期

一、基礎環境 1.1 項目依賴 package.json {"name": "erp-web","version": "1.0.0","description": "ERP系統前端 - React 19","main": "index.js","type": "module",…

【機器學習筆記 Ⅱ】1 神經網絡

神經網絡是一種受生物神經元啟發設計的機器學習模型,能夠通過多層非線性變換學習復雜的輸入-輸出關系。它是深度學習的基礎,廣泛應用于圖像識別、自然語言處理、游戲AI等領域。1. 核心思想 生物類比:模仿人腦神經元的工作方式,通過…

謝飛機的Java高級開發面試:從Spring Boot到分布式架構的蛻變之旅

面試現場:謝飛機的求職奇遇記 "請坐,謝先生。我看你簡歷上寫了精通Lombok?"面試官推了推金絲眼鏡。 謝飛機一愣:"啊...這個..."突然掏出手機,"您看我GitHub開源項目里用了SneakyThrows&…

一站式整合:解鎖高效后端管理利器——Motia

在當今的科技世界中,企業對于后端系統的要求越來越高。無論是處理復雜的 API 請求、管理后臺任務,還是集成 AI 代理,這些都需要一個強大的框架來支撐。而今天,我們要介紹的 Motia 正是這樣一個現代化、統一的后端框架,…

如何將信息從 iPhone 同步到Mac(完整步驟和示意圖)

如果您是 Apple 用戶,您一定知道在所有設備上保持同步是多么便捷。Apple 生態系統的一大亮點就是能夠在 iPhone 和 Mac 之間同步 iMessage 和短信。如果您想了解如何將信息從 iPhone 同步到 Mac,千萬不要錯過本教程。快速瀏覽一下這些方法:第…

【C++字符串變換】2022-7-20

緣由C問題-字符串變換-編程語言-CSDN問答 void 字符串變換() {string s "", t ""; char f; int x 0, g 1, l 0;cin >> s; l s.size();while (x <l){f s[x];if (f s[x 1]){g, s.erase(x, 1);}else{if (g > 1){s.erase(x, 1);t s.sub…

Web攻防-XMLXXE無回顯帶外SSRF元數據DTD實體OOB盲注文件拓展

知識點&#xff1a; 1、WEB攻防-XML&XXE-注入原理&分類&修復 2、WEB攻防-XML&XXE-文件讀取&SSRF&實體引用 3、WEB攻防-XML&XXE-無回顯&升級拓展&挖掘思路 一、演示案例-WEB攻防-XML&XXE-注入原理&分類&安全影響 詳細點 XML被…

Node中Unexpected end of form 錯誤

文章目錄Unexpected end of form 錯誤為什么 app.use(upload.any()) 會導致 Unexpected end of form 錯誤&#xff1f;1. 主要問題分析app.use(upload.any()) 的問題錯誤場景2. 解決方案? 方案 1&#xff1a;僅在需要文件上傳的路由使用 Multer&#xff08;推薦&#xff09;?…

通過Curtain 解決方案保障BIM模型安全共享—建筑業的防泄密實戰

某跨海大橋項目突發數據泄露事件&#xff1a;主橋鋼結構的BIM模型被外泄&#xff0c;核心參數流入競爭對手手中&#xff0c;導致項目風險評估升級。調查發現&#xff0c;泄漏源頭是一名施工方的項目經理。盡管BIM系統已經能夠控制哪些人可以閱讀、修改、甚至下載資料的權限&…

ULVAC愛發科RFS03D RF POWER SUPPLY INSTRUCTION MANUAL RF射頻電源

ULVAC愛發科RFS03D RF POWER SUPPLY INSTRUCTION MANUAL RF射頻電源

暑假算法日記第三天

目標?&#xff1a;刷完靈神專題訓練算法題單 階段目標&#x1f4cc;&#xff1a;【算法題單】滑動窗口與雙指針 LeetCode題目: 3439. 重新安排會議得到最多空余時間 I2134. 最少交換次數來組合所有的 1 II1297. 子串的最大出現次數2653. 滑動子數組的美麗值1888. 使二進制字符…

了解業務分析技術梗概

業務分析技術 以下基于BABOK V3框架&#xff0c;結合業務分析師&#xff08;BA&#xff09;的實際工作場景&#xff0c;系統梳理50項業務分析技術、常用工具、學習路徑及文檔應用指南。內容綜合BABOK官方標準及行業實踐&#xff0c;旨在提升BA的工作效能。 一、BABOK V3 技術體…