Spring MVC 重定向(Redirect)詳解


在這里插入圖片描述

Spring MVC 重定向(Redirect)詳解


1. 核心概念與作用

重定向(Redirect) 是 Spring MVC 中一種客戶端重定向機制,通過 HTTP 302 狀態碼(默認)將用戶瀏覽器重定向到指定 URL。

  • 主要用途
    • 防止表單重復提交(提交后跳轉到新頁面)。
    • 實現頁面跳轉(如登錄成功后跳轉到主頁)。
    • URL 重寫或簡化(如將 /old-path 重定向到 /new-path)。

2. 基本使用方式

2.1 通過返回值直接重定向

在控制器方法中直接返回 redirect:URL 格式的字符串:

@GetMapping("/login")
public String loginSuccess() {// 登錄成功后重定向到主頁return "redirect:/home"; 
}
2.2 指定重定向 URL 路徑
  • 絕對路徑redirect:/home
  • 相對路徑redirect:../another-page(不推薦,易出錯)
  • 外部 URLredirect:https://example.com(需謹慎使用)。

3. 傳遞參數到重定向目標

3.1 在 URL 中追加查詢參數
@GetMapping("/search")
public String search(@RequestParam String query) {return "redirect:/results?query=" + query; // 原始方式
}
3.2 使用占位符語法(推薦)

Spring 提供模板化的參數注入:

@GetMapping("/search")
public String search(@RequestParam String query) {// 使用占位符 {query} 自動替換return "redirect:/results?query={query}".replace("{query}", query);
}
// 或更簡潔的寫法:
return "redirect:/results?query=" + URLEncoder.encode(query, StandardCharsets.UTF_8);

4. 通過 RedirectAttributes 傳遞數據

RedirectAttributes 是 Spring 提供的專門用于重定向時傳遞數據的接口,數據會通過 Flash Scope 存儲(在重定向請求中有效)。

4.1 基本用法
@PostMapping("/submit")
public String submitForm(@ModelAttribute FormData data, RedirectAttributes attributes) {// 存儲數據到 Flash Scopeattributes.addAttribute("message", "提交成功");attributes.addFlashAttribute("user", data.getUser());return "redirect:/confirmation";
}
4.2 在目標頁面獲取數據
@GetMapping("/confirmation")
public String showConfirmation(@ModelAttribute("user") User user,@RequestParam("message") String message) {// 處理數據return "confirmation";
}

5. 使用 RedirectView 對象

通過返回 RedirectView 對象實現重定向,提供更多控制選項:

@GetMapping("/custom-redirect")
public RedirectView customRedirect() {RedirectView redirectView = new RedirectView("/home", true); // 第二個參數:是否重寫 URLredirectView.setUrl("/home?param=value");return redirectView;
}

6. 與轉發(Forward)的區別
對比項重定向(Redirect)轉發(Forward)
請求次數生成新的 HTTP 請求(客戶端發起)單次請求,服務器內部跳轉
URL 變化瀏覽器地址欄顯示新 URL地址欄 URL 保持不變
數據傳遞需通過 URL 參數或 Flash Scope可直接傳遞模型數據(Model
適用場景防重復提交、跨控制器跳轉內部頁面跳轉(如模塊間協作)

7. 完整代碼示例

7.1 基礎重定向
@Controller
public class RedirectController {@GetMapping("/login")public String login() {// 直接重定向到主頁return "redirect:/home";}@GetMapping("/home")public String home() {return "home"; // 返回視圖名稱}
}
7.2 帶參數的重定向
@GetMapping("/search")
public String search(@RequestParam String query) {// 將查詢參數傳遞到 results 頁面return "redirect:/results?query=" + URLEncoder.encode(query, StandardCharsets.UTF_8);
}@GetMapping("/results")
public String results(@RequestParam String query, Model model) {model.addAttribute("query", query);return "results";
}
7.3 使用 RedirectAttributes
@PostMapping("/submit")
public String submitForm(@ModelAttribute FormData data, RedirectAttributes attributes) {attributes.addFlashAttribute("successMessage", "提交成功");return "redirect:/thank-you";
}@GetMapping("/thank-you")
public String thankYou(@ModelAttribute("successMessage") String message, Model model) {model.addAttribute("message", message);return "thank-you";
}

8. 常見問題與解決方案

Q1:重定向后參數丟失?
  • 原因:未正確編碼特殊字符(如空格、中文)。
  • 解決:使用 URLEncoder.encode() 編碼參數:
    String encodedQuery = URLEncoder.encode(query, StandardCharsets.UTF_8);
    return "redirect:/results?query=" + encodedQuery;
    
Q2:如何修改重定向的 HTTP 狀態碼(如 301)?
  • 默認:Spring 使用 302 臨時重定向。
  • 自定義狀態碼:需結合 ResponseEntity
    @GetMapping("/permanent-redirect")
    public ResponseEntity<?> permanentRedirect() {return ResponseEntity.status(301).location(URI.create("/new-url")).build();
    }
    
Q3:RedirectAttributes 的數據在目標頁面不可見?
  • 原因:未使用 addFlashAttribute(),而是直接 addAttribute()
  • 修正
    attributes.addFlashAttribute("user", user); // 使用 addFlashAttribute()
    

9. 總結表格:重定向方法對比
方法類型實現方式參數傳遞能力適用場景
返回字符串return "redirect:/url"簡單參數基礎重定向
RedirectView返回 RedirectView 對象高度靈活需自定義重定向邏輯
RedirectAttributes通過 addFlashAttribute()復雜對象需傳遞模型數據到重定向頁面

總結

Spring MVC 的重定向機制通過 redirect: 前綴和 RedirectAttributes 等工具,提供了靈活的跳轉能力。核心是理解客戶端重定向與服務器轉發的區別,以及如何安全地傳遞數據。實際開發中,推薦使用 RedirectAttributes 處理復雜數據,避免手動拼接 URL 參數可能帶來的安全風險(如 XSS 攻擊)。

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

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

相關文章

《深入探秘:分布式軟總線自發現、自組網技術原理》

在當今數字化浪潮中&#xff0c;分布式系統的發展日新月異&#xff0c;而分布式軟總線作為實現設備高效互聯的關鍵技術&#xff0c;其自發現與自組網功能宛如打開智能世界大門的鑰匙&#xff0c;為多設備協同工作奠定了堅實基礎。 分布式軟總線的重要地位 分布式軟總線是構建…

eplan許可證的用戶權限管理

在電氣設計領域&#xff0c;EPLAN軟件以其強大的功能和靈活性而備受用戶青睞。然而&#xff0c;隨著企業規模的擴大和團隊人數的增加&#xff0c;如何確保軟件使用的安全與效率成為了一個重要的問題。EPLAN許可證的用戶權限管理功能為此提供了完美的解決方案。本文將詳細介紹EP…

pytorch小記(十七):PyTorch 中的 `expand` 與 `repeat`:詳解廣播機制與復制行為(附詳細示例)

pytorch小記&#xff08;十七&#xff09;&#xff1a;PyTorch 中的 expand 與 repeat&#xff1a;詳解廣播機制與復制行為&#xff08;附詳細示例&#xff09; &#x1f680; PyTorch 中的 expand 與 repeat&#xff1a;詳解廣播機制與復制行為&#xff08;附詳細示例&#xf…

Databricks: Why did your cluster disappear?

You may found that you created a cluster many days ago, and you didnt delete it, but it is disapear. Why did this happen? Who deleted the cluster? Actually, 30 days after a compute is terminated, it is permanently deleted automaticlly. If your workspac…

C語言【輸出字符串中的大寫字母】

題目 輸出字符串中的大寫字母 思路&#xff08;注意事項&#xff09; 純代碼 #include<stdio.h> #include<string.h>int main(){char str[20], ans[20];fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] \0;for (int i 0, j 0; i < strl…

基于隊列構建優先級搶占機制的LED燈框架設計與實現

文章目錄 前言一、LED 顯示框架概述1. 框架結構圖2. 基本機制 二、核心結構與接口設計1. 狀態命令結構2. 狀態項結構3. LED框架配置結構4. LED運行控制器 三、LED框架邏輯流程1. 初始化邏輯2. 優先級搶占判斷與處理邏輯3. 執行隊列命令并處理tick4. 隊列為空時的默認狀態回滾 四…

PyQt6實例_A股財報數據維護工具_解說并數據與完整代碼分享

目錄 1 20250403之前的財報數據 2 整個項目代碼 3 工具使用方法 3.1 通過akshare下載 3.2 增量更新 3.3 查看當前數據情況 3.4 從數據庫中下載數據 視頻 1 20250403之前的財報數據 通過網盤分享的文件&#xff1a;財報三表數據20250403之前.7z 鏈接: https://pan.ba…

React 之 Redux 第三十一節 useDispatch() 和 useSelector()使用以及詳細案例

使用 Redux 實現購物車案例 由于 redux 5.0 已經將 createStore 廢棄&#xff0c;我們需要先將 reduxjs/toolkit 安裝一下&#xff1b; yarn add reduxjs/toolkit// 或者 npm install reduxjs/toolkit使用 vite 創建 React 項目時候 配置路徑別名 &#xff1a; // 第一種寫法…

Spring Boot 中集成 Knife4j:解決文件上傳不顯示文件域的問題

Spring Boot 中集成 Knife4j&#xff1a;解決文件上傳不顯示文件域的問題 在使用 Knife4j 為 Spring Boot 項目生成 API 文檔時&#xff0c;開發者可能會遇到文件上傳功能不顯示文件域的問題。本文將詳細介紹如何解決這一問題&#xff0c;并提供完整的解決方案。 Knife4j官網…

OpenCV 圖形API(17)計算輸入矩陣 src 中每個元素的平方根函數sqrt()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 計算數組元素的平方根。 cv::gapi::sqrt 函數計算每個輸入數組元素的平方根。對于多通道數組&#xff0c;每個通道會獨立處理。其精度大約與內置的 …

大學論文書寫規范與格式說明

大學論文書寫規范與格式說明 (適用于人文社科、理工科通用框架) 一、論文整體結構 1. 基本組成部分 封面 包含論文標題、作者姓名、學院/專業、學號、指導教師、提交日期等(按學校模板填寫)。 中英文摘要 中文摘要:300~500字,概述研究背景、方法、結論與創新點,末尾附…

C# 串口通信

1. 導入 using System.IO.Ports;2. 初始化定義 SerialPort sp new SerialPort(); // 設置串口 sp.PortName "COM3"; // 串口 sp.BaudRate 9600; // 波特率 sp.Parity Parity.None; // 校驗位 sp.DataBits 8; // 數據位 sp.StopBits StopBits.One; // 停…

android14 keycode 上報 0 解決辦法

驅動改完后發現上報了keycode=0 04-07 13:02:33.201 2323 2662 D WindowManager: interceptKeyTq keycode=0 interactive=false keyguardActive=true policyFlags=2000000 04-07 13:02:33.458 2323 2662 D WindowManager: interceptKeyTq keycode=0 interactive=false key…

C++day9

思維導圖 牛客練習 練習&#xff1a; 將我們寫的 myList 迭代器里面 operator[] 和 operator 配合異常再寫一遍 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector>…

批量合并多張 jpg/png 圖片為長圖或者 PDF 文件,支持按文件夾合并圖片

我們經常會碰到需要將多張圖片拼成一張圖片的場景&#xff0c;比如將多張圖片拼成九宮格圖片&#xff0c;或者將多張圖片拼成一張長圖。還有可能會碰到需要將多張圖片合并成一個完整的 PDF 文件來方便我們進行打印或者傳輸等操作。那這些將圖片合并成一張圖片或者一個完整的文檔…

程序化廣告行業(73/89):買賣雙方需求痛點及應對策略深度剖析

程序化廣告行業&#xff08;73/89&#xff09;&#xff1a;買賣雙方需求痛點及應對策略深度剖析 大家好&#xff01;一直以來&#xff0c;我都熱衷于在技術領域探索學習&#xff0c;也深知知識的分享能讓我們共同進步。寫這篇博客的目的&#xff0c;就是希望能和大家一起深入了…

[隨筆] nn.Embedding的前向傳播與反向傳播

nn.Embedding的前向傳播與反向傳播 nn.Embedding的前向計算過程 embedding module 的前向過程其實是一個索引&#xff08;查表&#xff09;的過程 表的形式是一個 matrix&#xff08;embedding.weight, learnable parameters&#xff09; matrix.shape: (v, h) v&#xff1a;…

構建實時、融合的湖倉一體數據分析平臺:基于 Delta Lake 與 Apache Iceberg

1. 執行摘要 挑戰&#xff1a; 傳統數據倉庫在處理現代數據需求時面臨諸多限制&#xff0c;包括高昂的存儲和計算成本、處理海量多樣化數據的能力不足、以及數據從產生到可供分析的端到端延遲過高。同時&#xff0c;雖然數據湖提供了低成本、靈活的存儲&#xff0c;但往往缺乏…

Maven error:Could not transfer artifact

問題描述 當項目從私有倉庫下載依賴時&#xff0c;Maven 報錯&#xff0c;無法從遠程倉庫下載指定的依賴包&#xff0c;錯誤信息如下&#xff1a; Could not transfer artifact com.ding.abcd:zabk-java:pom from/to releases (http://192.1122.101/repory/mavenleases/): 此…

Dify 生成提示詞的 Prompt

Dify 生成提示詞的 Prompt **第1次提示詞****第2次提示詞****第3次提示詞**總結 Dify 生成提示詞是&#xff0c;會和LLM進行3次交互&#xff0c;下面是和LLM進行交互是的Prompt。 以下是每次提示詞的概要、目標總結以及原始Prompt&#xff1a; 第1次提示詞 概要&#xff1a; …