HTTP 請求轉發與重定向詳解及其應用(含 Java 示例)

? ? ? ?在 Web 開發中,我們經常需要在不同頁面之間跳轉,比如登錄成功后跳到首頁、提交表單后跳到結果頁面。這時,常見的兩種跳轉方式就是 請求轉發(Request Forward)重定向(Redirect)

? ? ? ?雖然它們都能實現“頁面跳轉”,但底層原理、適用場景和實現方式都不同。

一、請求轉發(Forward)

1. 定義

請求轉發是服務器內部的一種操作方式,它允許服務器將客戶端請求在服務器內部轉發給另一個資源(如 JSP 或 Servlet)進行處理,而客戶端對轉發行為是“不可見”的。

簡單理解:

用戶發送請求 → 服務器內部轉發 → 返回最終響應給用戶(URL 不變)

2. 工作原理

  1. 客戶端發送請求到服務器。

  2. 服務器接收請求,并在內部通過 RequestDispatcher 將請求轉發給另一個資源。

  3. 轉發的資源使用相同的請求對象 request 和響應對象 response

  4. 客戶端看到的 URL 不會改變

3. 使用方式

// Servlet 示例
RequestDispatcher dispatcher = request.getRequestDispatcher("target.jsp");
dispatcher.forward(request, response);

4. 特點

  • 地址欄 URL 不變,對用戶透明。

  • 請求作用域共享,轉發后的資源可以訪問原請求中的數據(如 request.setAttribute())。

  • 服務器內部操作,效率較高。

  • 不能轉發到其他服務器或不同的域名。

5. 典型場景

  • 登錄成功后,轉發到用戶首頁。

  • 請求處理后將結果展示在 JSP 頁面。

  • MVC 模式中,Controller 轉發給 View。

6. Java示例

@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if ("admin".equals(username) && "123".equals(password)) {// 存儲數據到 requestreq.setAttribute("user", username);// 請求轉發到首頁req.getRequestDispatcher("/home.jsp").forward(req, resp);} else {req.setAttribute("msg", "用戶名或密碼錯誤");req.getRequestDispatcher("/login.jsp").forward(req, resp);}}
}

二、重定向(Redirect)

1. 定義

重定向是服務器向客戶端發送一個新的 URL,讓瀏覽器再次發起請求。瀏覽器地址欄會發生變化。

簡單理解:

用戶發送請求 → 服務器返回 302 狀態碼和新 URL → 瀏覽器重新請求新 URL → 返回響應

2. 工作原理

  1. 客戶端發送請求到服務器。

  2. 服務器通過 response.sendRedirect("新地址") 告訴瀏覽器去請求新的 URL。

  3. 瀏覽器收到響應后,再次發送請求到新的 URL。

  4. 客戶端地址欄發生變化。

3. 使用方式

// Servlet 示例
response.sendRedirect("target.jsp");

4. 特點

  • 地址欄 URL 會改變

  • 請求作用域不共享,相當于新的請求。

  • 可以重定向到其他網站。

  • 需要客戶端再次發起請求,效率略低于轉發。

5. 典型場景

  • 表單提交后避免重復提交(Post/Redirect/Get 模式)。

  • 登錄成功后跳轉到另一個模塊或不同域的頁面。

  • 頁面重構或網站 URL 改變時進行跳轉。

6. Java示例

@WebServlet("/loginRedirect")
public class LoginRedirectServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if ("admin".equals(username) && "123".equals(password)) {// 登錄成功后重定向到首頁resp.sendRedirect(req.getContextPath() + "/home.jsp");} else {// 帶參數重定向(URL 拼接)resp.sendRedirect(req.getContextPath() + "/login.jsp?error=1");}}
}

三、請求轉發與重定向的對比

特性請求轉發(Forward)重定向(Redirect)
URL顯示不變改變
請求對象共享不共享,新的請求
瀏覽器行為瀏覽器不感知瀏覽器必須發起新請求
可跨域可以
性能高(服務器內部操作)較低(客戶端需再次請求)
使用場景內部資源跳轉,如 MVC 轉發表單防重、跨站跳轉

四、與安全相關的提示

請求轉發和重定向在實際開發中,需要注意一些安全問題,特別是 SQL 注入開放重定向

  1. SQL 注入

    • 轉發或重定向本身不會直接導致 SQL 注入,但如果傳遞參數沒有做安全處理,攻擊者可以通過 URL 或表單注入惡意 SQL。

    • 建議:使用 PreparedStatement 或參數化查詢,避免直接拼接 SQL。

  2. 開放重定向風險

    • 重定向如果直接使用用戶提供的 URL,可能被攻擊者利用跳轉到惡意網站。

    • 建議:對重定向的 URL 做 白名單校驗,不要直接使用用戶輸入。


五、實用小 Tips

  • 使用轉發傳遞數據

request.setAttribute("msg", "登錄成功");
request.getRequestDispatcher("home.jsp").forward(request, response);
  • 使用重定向避免重復提交

response.sendRedirect("home.jsp");
  • 避免跨站重定向漏洞

String target = request.getParameter("url");
if (target != null && target.startsWith("/app")) {response.sendRedirect(target);
} else {response.sendRedirect("/app/home.jsp");
}


六、總結

  • 請求轉發:服務器內部跳轉,地址欄不變,請求共享,適合內部資源處理。

  • 重定向:客戶端跳轉,地址欄改變,不共享請求,適合防重、跨站跳轉。

  • 安全方面,注意 SQL 注入開放重定向

? ? ? ?掌握了請求轉發與重定向的原理、使用方式及場景,你就能在 Java Web 開發中更加靈活地處理請求和頁面跳轉。

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

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

相關文章

如何將 MCP Server (FastMCP) 配置為公網訪問(監聽 0.0.0.0)

如何將 MCP Server (FastMCP) 配置為公網訪問(監聽 0.0.0.0)引言常見錯誤嘗試根本原因:從源碼解析正確的解決方案總結引言 在使用 Model Context Protocol(MCP) 框架開發自定義工具服務器時,我們經常使用 …

The Network Link Layer: 無線傳感器中Delay Tolerant Networks – DTNs 延遲容忍網絡

Delay Tolerant Networks – DTNs 延遲容忍網絡架構歸屬Delay Tolerant Networks – DTNs 延遲容忍網絡應用實例例子 1:瑞典北部的薩米人 (Saami reindeer herders)例子 2:太平洋中的動物傳感網絡DTNs路由方式——存儲&轉發DTNs移動模型Random walk …

計算機視覺(opencv)實戰二——圖像邊界擴展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 圖像邊界擴展詳解與實戰在圖像處理和計算機視覺中,有時需要在原始圖像的四周增加邊界(Padding)。這種操作在很多場景中都有應用,比如:卷積神經網絡(CNN)中的圖像預處理…

ansible管理變量和事實

ansible管理變量和事實與實施任務控制 在 Ansible 中,變量和事實(Facts)就像給劇本(Playbook)配備的 “信息工具箱”,讓你的自動化配置管理更靈活、更智能。 變量:提前準備的 “預設信息” 變…

STM32--寄存器與標準庫函數--基本定時器

目錄 前言 基本定時器概念 定時時間 定時器時鐘確定 倍頻鎖相環被正確配置為168MHz 定時器的庫函數操作 代碼 定時器的寄存器操作 代碼 寄存器 后言 前言 使用平臺:STM32F407ZET6 使用數據手冊:STM32F407數據手冊.pdf 使用參考手冊&…

PCA 實現多向量壓縮:首個主成分的深層意義

PCA 實現多向量壓縮 第一個主成分(components_[0])正是數據協方差矩陣中最大特征值對應的特征向量。 ,layer_attention_vector[layer] 被賦值為 pca.components_[0],這確實是一個特征向量,具體來說是 PCA 分解得到的第一個主成分(主特征向量)。 關于它的維度: 假設 c…

網絡常識-DNS如何解析

DNS(Domain Name System,域名系統)是互聯網的“地址簿”,負責將人類易記的域名(如www.example.com)轉換為計算機可識別的IP地址(如192.168.1.1)。其工作流程可以簡單理解為“從域名到…

Java中 23 種設計模式介紹,附帶示例

文章目錄設計模式六大原則設計模式分類1、創建型模式(Creational Patterns)2、結構型模式(Structural Patterns)3、行為型模式(Behavioral Patterns)一、創建型模式(Creational Patterns&#x…

嵌入式開發入門——電子元器件~電磁繼電器、蜂鳴器

文章目錄電磁繼電器定義關鍵參數實物蜂鳴器實物內部結構分類關鍵參數電磁繼電器 定義 概述:電磁繼電器是利用電磁感應原理職稱的一種電磁開關,他能通過:低電壓、低電流的電路,來控制高電壓、高電流的電路。 關鍵參數 線圈電壓…

ROS2基礎

1.helloworld案例1.創建功能包(C)終端下,進入ws00_helloworld/src目錄,使用如下指令創建一個C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld執行完畢&a…

Python爬蟲實戰:研究pygalmesh,構建Thingiverse平臺三維網格數據處理系統

1. 引言 1.1 研究背景 在數字化浪潮席卷全球的當下,三維建模技術已成為連接虛擬與現實的核心紐帶,廣泛滲透于工程設計、地理信息系統(GIS)、虛擬現實(VR)、增強現實(AR)、醫學影像等關鍵領域。例如,在建筑工程中,BIM(建筑信息模型)技術依賴高精度三維網格實現施工…

開發者說 | EmbodiedGen:為具身智能打造可交互3D世界生成引擎

概述 具身智能的發展離不開高質量、多樣化的可交互3D仿真環境。為突破傳統構建方式的瓶頸,我們提出了EmbodiedGen,一個基于生成式AI技術的自動化3D世界生成引擎,助力低成本、高效率地創建真實且可交互的3D場景。用戶僅需輸入任務定義或場景圖…

GitHub Copilot:AI編程助手的架構演進與真實世界影響

本文由「大千AI助手」原創發布,專注用真話講AI,回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我,一起撕掉過度包裝,學習真實的AI技術! 1. 技術背景與核心架構 GitHub Copilot 是由 GitHub 與 OpenAI 聯合開…

PDF OCR + 大模型:讓文檔理解不止停留在識字

在企業數字化的實際場景中,PDF OCR 已經很普遍了:從掃描件提取文本、表格到生成可搜索 PDF。但這類技術往往停留在"把圖片變成文字",對文檔背后的語義、邏輯、業務價值理解不足。 而當 OCR 遇上大語言模型(LLM&#xff…

半敏捷衛星觀測調度系統的設計與實現

半敏捷衛星觀測調度系統的設計與實現 摘要 本文詳細闡述了一個基于Python的半敏捷衛星觀測調度系統的設計與實現過程。系統針對半敏捷衛星特有的機動能力限制,綜合考慮了地面目標觀測需求、衛星資源約束、能源管理等多重因素,提出了一種混合啟發式算法解…

軟件測試中,常用的抓包工具有哪些?抓包的原理是什么?

回答重點在軟件測試中,常用的抓包工具主要有:1)Fiddler2)Wireshark3)Charles4)Postman(它的攔截器功能也可以用于抓包)5)tcpdump抓包的原理大致是通過安裝在本地的抓包工…

Cesium學習(二)-地形可視化處理

Cesium地形可視化是其核心功能之一,允許開發者在3D地球中展示真實的地形數據。以下是關于Cesium地形可視化的詳細處理方法: 文章目錄1. 啟用地形可視化基本地形加載自定義地形提供者2. 地形相關操作地形高度采樣地形夸張效果3. 地形可視化設置地形照明效…

《告別 if-else 迷宮:Python 策略模式 (Strategy Pattern) 的優雅之道》

《告別 if-else 迷宮:Python 策略模式 (Strategy Pattern) 的優雅之道》 大家好,我是你的朋友,一位與 Python 代碼相伴多年的開發者。在我們的編程生涯中,幾乎都曾與一種“代碼怪獸”搏斗過,它就是那冗長、復雜、牽一發而動全身的 if-elif-else 結構。 每當一個新的需求…

Redis--day7--黑馬點評--優惠券秒殺

(以下內容全部來自上述課程)優惠券秒殺 1. 全局唯一ID 每個店鋪都可以發布優惠券:當用戶搶購時,就會生成訂單并保存到tb voucher order這張表中,而訂單表如果使用數據庫自增ID就存在一些問題: id的規律性太明顯受單表數據量的限制…

Vue 與 React 深度對比:設計哲學、技術差異與應用場景

一、核心設計理念對比 特性 Vue React 設計目標 漸進式框架,降低學習曲線 構建大型應用,保持靈活性 設計哲學 “約定優于配置” “配置優于約定” 核心思想 響應式數據綁定 函數式編程 + 虛擬DOM 模板語言 HTML-based 模板 JSX(JavaScript XML) 狀態管理 內置響應式系統 依…