请求转发和重定向是Spring MVC中两种核心导航机制:转发为服务端内部跳转,URL不变且共享request数据;重定向为客户端发起新请求,URL变更且原request数据清空,需通过RedirectAttributes传递flash属性。

Spring MVC 中请求转发(forward)和重定向(redirect)是实现页面导航的两种核心机制,它们语义不同、适用场景不同,选错会导致数据丢失、重复提交或用户体验异常。
请求转发:服务端内部跳转,共享 request 作用域
转发是 Controller 处理完请求后,不返回响应,而是将请求“交给”另一个资源(如 JSP、Thymeleaf 模板或另一个 Controller 方法)继续处理。整个过程对浏览器透明,URL 不变,且原始 request 和 session 中的数据可直接传递过去。
- 语法:
return "forward:/path/to/other/handler"或return "forward:/WEB-INF/views/result.jsp" - 适合场景:表单提交后展示结果页、权限校验失败跳转至登录页(需保留错误提示)、同一请求链路中多个逻辑步骤的衔接
- 注意:转发只能访问当前应用内的资源;不能跨域;无法携带新参数(除非手动往 request.setAttribute() 中存)
重定向:客户端发起新请求,URL 变更,request 数据清空
重定向是 Controller 返回一个特殊响应(HTTP 302),告诉浏览器“请用 GET 方式重新请求另一个地址”。浏览器会发起全新请求,原 request 中的数据(如表单参数、model 属性)默认丢失,但可通过 URL 参数或 flash attributes 传递关键信息。
- 语法:
return "redirect:/success"或return "redirect:/user/list?keyword=" + keyword - 推荐方式传参:
RedirectAttributes(避免 URL 拼接乱码和 XSS):redirectAttrs.addFlashAttribute("message", "操作成功");
目标 Controller 方法参数中声明@ModelAttribute("message") String msg即可获取(仅一次有效) - 适合场景:POST 表单提交后防止刷新重复提交(PRG 模式)、登录成功跳转首页、权限不足跳转无权限页、跨子系统跳转(如 OAuth 回调)
转发与重定向的混合使用策略
复杂导航常需两者配合。例如用户提交订单:先校验库存(转发到校验逻辑),若失败则转发回订单页并带错误信息;若成功则重定向到支付页,同时用 flash attribute 传订单号。
立即学习“Java免费学习笔记(深入)”;
- 避免在重定向后还试图访问原 request 中的数据(会 NPE)
- 转发路径支持相对路径(如
"forward:check")和绝对路径("forward:/order/check");重定向路径默认相对于当前应用根路径 - Thymeleaf 模板中可通过
${message}直接读取 flash attribute,无需额外配置
常见陷阱与规避方法
实际开发中容易踩坑:比如用重定向却忘了传提示信息,导致用户不知操作是否成功;或误用转发导致多次提交;又或在转发时路径写错引发 404。
- 表单提交后一律优先考虑重定向(PRG 原则),除非有明确理由要保留 request 数据
- 转发路径不要以
/开头(除非是绝对路径),否则可能绕过 DispatcherServlet - 重定向 URL 中避免硬编码,用
MvcUriComponentsBuilder或@RequestMapping的 name 属性生成链接 - 前后端分离项目中,转发/重定向主要用于服务端渲染场景;纯 API 接口通常只返回 JSON,由前端路由控制跳转


















