当前位置: 首页 > article >正文

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 攻击)。

相关文章:

Spring MVC 重定向(Redirect)详解

Spring MVC 重定向&#xff08;Redirect&#xff09;详解 1. 核心概念与作用 重定向&#xff08;Redirect&#xff09; 是 Spring MVC 中一种客户端重定向机制&#xff0c;通过 HTTP 302 状态码&#xff08;默认&#xff09;将用户浏览器重定向到指定 URL。 主要用途&#xf…...

项目开发流程总结

目录 1. 项目启动阶段&#xff08;需求分析&#xff09; 2. 项目设计阶段 3. 开发阶段 4. 测试阶段 5. 打包和发布阶段 6. 运维和监控阶段 7. 版本迭代和维护阶段 项目生命周期中的管理要点&#xff1a; 总结&#xff1a; 一个完整的项目开发流程通常包括以下几个阶段…...

window上 docker使用ros2开发并usbip共享usb设备

曾经参考 https://blog.csdn.net/laoxue123456/article/details/138339029 来共享windows上的usb 发现没有办法成功总是出现 tcp 错误。telnet测试能够正常连接 很是奇怪&#xff0c;window上换成低版本的usbipd仍然是同样的错误&#xff0c;没有办法的情况下参考了docker官方文…...

基于MATLAB/simulink的信号调制仿真--AM调制

实验内容&#xff1a; 假设y(t)(20.5*2cos&#xff08;2*pi*1000*t&#xff09;)*5cos&#xff08;2*pi*2*1e4*t&#xff09;调幅系统&#xff0c;请将一个频率为1000HZ的余弦波信号&#xff0c;通过进行AM调制&#xff0c;载波信号频率为20kHZ的余弦波&#xff0c;调制度ma0.…...

Vue3+Ts封装ToolTip组件(2.0版本)

本组件支持hover和click两种触发方式&#xff0c;需要更多的触发方式&#xff0c;可自行去扩展&#xff01;&#xff01;&#xff01; 1.传递三个参数&#xff1a; content&#xff1a;要展示的文本 position&#xff1a;文本出现的位置&#xff08;"top" | "t…...

Latex语法入门之数学公式

Latex是一种高质量的排版系统&#xff0c;尤其擅长于数学公式的排版。本文我将带大家深入了解Latex在数学公式排版中的应用。从基础的数学符号到复杂的公式布局&#xff0c;我们都会一一讲解&#xff0c;通过本文的学习&#xff0c;你将能够轻松编写出清晰、美观的数学公式&…...

shell脚本 - Linux定时温度监控-软硬件检测 - 服务器温度监控 - 写入日志

效果图 脚本 vi auto.sh (chmod x ./auto.sh) #!/bin/bash # 按照日期创建一个文件或目录 https://blog.csdn.net/shoajun_5243/article/details/83539069 datetimedate %Y%m%d-%H%M%S |cut -b1-20 dirpath/systemMonitor/$datetime file1$dirpath/sensors.log file2$dirpa…...

Linux驱动开发进阶(六)- 多线程与并发

文章目录 1、前言2、进程与线程3、内核线程4、底半步机制4.1、软中断4.2、tasklet4.3、工作队列4.3.1、普通工作项4.3.2、延时工作项4.3.3、工作队列 5、中断线程化6、进程6.1、内核进程6.2、用户空间进程 7、锁机制7.1、原子操作7.2、自旋锁7.3、信号量7.4、互斥锁7.5、comple…...

买不起了,iPhone 或涨价 40% ?

周知的原因&#xff0c;新关税对 iPhone 的打击&#xff0c;可以说非常严重。 根据 Rosenblatt Securities分析师的预测&#xff0c;若苹果完全把成本转移给消费者。 iPhone 16 标配版的价格&#xff0c;可能上涨43%。 iPhone 16 标配的价格是799美元&#xff0c;上涨43%&am…...

Axure 列表滚动:表头非常多(横向滚动方向)、分页(纵向滚动) | 基于动态面板的滚动方向和取消调整大小以适合内容两个属性进行实现

文章目录 引言I 列表滚动的操作说明see also共享原型引言 Axure RP9教程 【数据传输】(页面值传递)| 作用域 :全局变量、局部变量 https://blog.csdn.net/z929118967/article/details/147019839?spm=1001.2014.3001.5501 基于动态面板的滚动方向和取消调整大小以适合内容两…...

RBAC 权限控制:深入到按钮级别的实现

RBAC 权限控制&#xff1a;深入到按钮级别的实现 一、前端核心思路 1. 大致实现思路 后端都过SELECT连表查询把当前登录的用户对应所有的权限返回过来&#xff0c;前端把用户对应所有的权限 存起来to(vuex/pinia) 中 &#xff0c;接着前端工程师需要知道每个按钮对应的权限代…...

大模型格式化输出的几种方法

大模型格式化输出的几种方法 在开发一些和LLM相关的应用的时候,如何从大模型的反馈中拿到结构化的输出数据是非常重要的,那么本文就记录几种常用的方法。 OpenAI提供的新方法 在 OpenAI 的 Python 库中,client.beta.chat.completions.parse 是一个用于生成结构化输出的方法…...

【区间贪心】合并区间 / 无重叠区间 / 用最少数量的箭引爆气球 / 俄罗斯套娃信封问题

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;贪心算法 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 合并区间无重叠区间用最少数量的箭引爆气球俄罗斯套娃信封问题 合并区间 合并区间 class Solution { public:vector<vecto…...

JBDC java数据库连接(2)

目录 JBDC建立 获得PrepareStatement执行sql语句 形式&#xff1a; PrepareStatement中的方法: 实例 PreparedStatement和Statement 基于以下的原因: JBDC建立 获得PrepareStatement执行sql语句 在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数 形式&…...

es --- 集群数据迁移

目录 1、需求2、工具elasticdump2.1 mac安装问题解决 2.2 elasticdump文档 3、迁移 1、需求 迁移部分新集群没有的索引和数据 2、工具elasticdump Elasticdump 的工作原理是将输入发送到输出 。两者都可以是 elasticsearch URL 或 File 2.1 mac安装 前置&#xff1a;已经安装…...

Redis高频面试题及深度解析(20大核心问题+场景化答案)

摘要&#xff1a;Redis作为高性能缓存与内存数据库&#xff0c;是后端开发的核心技术栈之一。本文整理20大高频Redis面试题&#xff0c;结合真实场景与底层源码逻辑&#xff0c;助你彻底掌握Redis核心机制。涵盖单线程模型、集群方案、分布式锁、持久化等核心知识点。 一、Redi…...

事件处理程序

事件处理程序 一、事件处理程序的定义 事件处理程序是一段代码&#xff0c;用于响应特定的事件。在网页开发中&#xff0c;事件是在文档或浏览器窗口中发生的特定交互瞬间&#xff0c;如用户点击按钮、页面加载完成等。事件处理程序则是针对这些事件执行的函数&#xff0c;它能…...

stable diffusion部署ubuntu

stable-diffusion webui: https://github.com/AUTOMATIC1111/stable-diffusion-webui python3.10 -m venv venv&#xff08;3.11的下torch会慢得要死&#xff09; source venv/bin/activate 下载checkpoint模型放入clip_version"/home/chen/软件/stable-diffusion-webu…...

Qt的window注册表读写以及删除

Qt的window注册表读写以及删除 1. 使用 QSettings&#xff08;Qt推荐方式&#xff09;基本操作关键点限制 2. 调用Windows原生API示例&#xff1a;创建/读取键值常用API注意事项 3. 高级场景(1) 递归删除键(2) 注册表权限修改 4. 安全性建议总结其他QT文章推荐 在Qt中操作Windo…...

聊一聊接口测试时遇到上下游依赖时该如何测试

目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法&#xff08;变量提取&#xff09; 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例&#xff08;以订单接口测试为例&#xff09; 3.1Mock依赖接口&…...

C++ 排序(1)

以下是一些插入排序的代码 1.插入排序 1.直接插入排序 // 升序 // 最坏&#xff1a;O(N^2) 逆序 // 最好&#xff1a;O(N) 顺序有序 void InsertSort(vector<int>& a, int n) {for (int i 1; i < n; i){int end i - 1;int tmp a[i];// 将tmp插入到[0,en…...

【有啥问啥】深入浅出讲解 Teacher Forcing 技术

深入浅出讲解 Teacher Forcing 技术 在序列生成任务&#xff08;例如机器翻译、文本摘要、图像字幕生成等&#xff09;中&#xff0c;循环神经网络&#xff08;RNN&#xff09;以及基于 Transformer 的模型通常采用自回归&#xff08;autoregressive&#xff09;的方式生成输出…...

zk基础—zk实现分布式功能

1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式&#xff1a;服务端主动将更新的数据发送给所有订阅的客户端。 拉模式&#xff1a;客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…...

mySQL数据库和mongodb数据库的详细对比

以下是 MySQL 和 MongoDB 的详细对比&#xff0c;涵盖优缺点及适用场景&#xff1a; 一、核心特性对比 特性MySQL&#xff08;关系型数据库&#xff09;MongoDB&#xff08;文档型 NoSQL 数据库&#xff09;数据模型结构化表格&#xff0c;严格遵循 Schema灵活的文档模型&…...

ubuntu wifi配置(命令行版本)

1、查询当前设备环境的wifi列表 nmcli dev wifi list2、连接wifi nmcli dev wifi connect "MiFi-SSID" password "Password" #其中MiFi-SSID是wifi的密码&#xff0c;Password是wifi的密码3、查看连接情况 nmcli dev status...

Docker与Kubernetes在ZKmall开源商城容器化部署中的应用

ZKmall开源商城作为高并发电商系统&#xff0c;其容器化部署基于DockerKubernetes技术栈&#xff0c;实现了从开发到生产环境的全流程标准化与自动化。以下是核心应用场景与技术实现&#xff1a; 一、容器化基础&#xff1a;Docker镜像与微服务隔离 ​服务镜像标准化 ​分层构建…...

华为AI-agent新作:使用自然语言生成工作流

论文标题 WorkTeam: Constructing Workflows from Natural Language with Multi-Agents 论文地址 https://arxiv.org/pdf/2503.22473 作者背景 华为&#xff0c;北京大学 动机 当下AI-agent产品百花齐放&#xff0c;尽管有ReAct、MCP等框架帮助大模型调用工具&#xff0…...

MYSQL数据库语法补充

一&#xff0c;DQL基础查询 DQL&#xff08;Data Query Language&#xff09;数据查询语言&#xff0c;可以单表查询&#xff0c;也可以多表查询 语法&#xff1a; select 查询结果 from 表名 where 条件&#xff1b; 特点&#xff1a; 查询结果可以是&#xff1a;表中的字段…...

Elasticsearch单节点安装手册

Elasticsearch单节点安装手册 以下是一份 Elasticsearch 单节点搭建手册&#xff0c;适用于 Linux 系统&#xff08;如 CentOS/Ubuntu&#xff09;&#xff0c;供学习和测试环境使用。 Elasticsearch 单节点搭建手册 1. 系统要求 操作系统&#xff1a;Linux&#xff08;Cent…...

在Windows搭建gRPC C++开发环境

一、环境构建 1. CMake Download CMake 2. Git Git for Windows 3. gRPC源码 git clone -b v1.48.0 https://github.com/grpc/grpc 进入源码目录 cd grpc 下载依赖库 git submodule update --init 二、使用CMake生成工程文件 三、使用vs2019编译grpc库文件 四、使用…...