Spring Boot 页面跳转:重定向与请求转发详解及代码示例

云舒
云舒
发布时间:2026-10-16| 6人浏览过
原创

在 Spring Boot 开发中,Controller 向视图层返回结果时,常需处理页面跳转。掌握请求转发与重定向的区别对于构建健壮的应用至关重要。本文将分析两者的底层行为差异,提供标准的 Java 实现代码,并明确何时使用转发以保留数据,何时使用重定向以防止表单重复提交。

准备条件:注解与模板限制

在深入具体跳转逻辑前,需明确 Spring Boot 对页面访问的基础约束:

  1. Controller 注解选择:若目标是通过返回字符串解析为 HTML 页面跳转,必须使用 @Controller。若误用 @RestController,其隐含的 @ResponseBody 会将返回值视为 JSON 或纯文本直接输出到浏览器,导致无法触发页面跳转。
  2. 模板引擎路径限制:默认配置下,Spring Boot 的请求转发通常指向 src/main/resources/templates/ 目录下的模板文件(如 Thymeleaf)。若不经过额外静态资源映射配置,直接转发至 static 或 public 目录下的普通 HTML 可能会因视图解析器未识别而失败。

操作顺序:请求转发(Forward)的实现与特点

请求转发是服务器内部的行为,浏览器地址栏保持不变,且整个生命周期内只产生一次 HTTP 请求。适用于需要在多个步骤间共享 Request 域数据的场景。

第1步:使用关键字进行转发

目的:最简单地在控制器方法中指定内部跳转路径。
入口:继承自 `HttpServlet` 的控制器方法。
动作:返回字符串,并以 "forward:" 开头。
参数注意:@Controller 类中使用。路径通常指模板名称或相对路径,若手动写 `.html` 后缀可能导致解析歧义,建议仅写模板名。

@RequestMapping(value="/test/forward", method = RequestMethod.GET)
public String testForward(@PathVariable String name) {
    // 假设存在名为 hello 的模板文件或转发至其他 handler
    return "forward:/ceng/hello"; 
}

第2步:使用 Servlet API 进行转发

目的:在需要更精细控制或使用 @RestController 混合模式时使用。
入口:注入 HttpServletRequest。
动作:获取 RequestDispatcher 并执行 forward。

@RequestMapping(value="/test/forwardApi", method = RequestMethod.GET)
public void testForwardApi(@PathVariable String name, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 获取请求分发器
    RequestDispatcher dispatcher = request.getRequestDispatcher("/ceng/hello.html");
    // 执行转发
    dispatcher.forward(request, response);
}

操作顺序:重定向(Redirect)的实现与特点

重定向是客户端行为,服务器响应后通知浏览器发起新的 GET 请求。此时地址栏更新为第二次请求的 URL,且原有 Request 域中的数据会丢失(因为建立了新的 Request 对象)。适用于“ POST-redirect-GET ”模式,防止刷新导致的数据重复提交。

第3步:使用关键字进行重定向

目的:快速跳转到另一个资源。
入口:控制器方法。
动作:返回字符串,以 "redirect:" 开头。
参数注意:如果是跳转到静态 HTML 页,必须显式写出文件名(如 index.html),否则可能无法匹配;如果是跳转到另一个 Controller 接口,则写接口路径。

@RequestMapping(value="/test/redirect", method = RequestMethod.GET)
public String testRedirect(@PathVariable String name) {
    // 注意:这里通常建议写完整路径或相对于 contextPath 的路径
    return "redirect:/ceng/hello.html";
}

第4步:使用 Servlet API 进行重定向

目的:兼容性强,可在 @RestController 中使用(需注意返回类型为 void 且不写响应体)。
入口:注入 HttpServletResponse。
动作:调用 sendRedirect。

@RequestMapping(value="/test/redirectApi", method = RequestMethod.GET)
public void testRedirectApi(@PathVariable String name, HttpServletResponse response) throws IOException {
    // 执行重定向
    response.sendRedirect("/ceng/hello.html");
}

完成判断:核心差异对比与应用场景

选择跳转策略的核心依据在于对 URL、请求次数及数据完整性的要求。

关键特征对比

  • URL 显示:
    - 转发:地址栏始终显示初始请求的地址(如 /test/forward)。
    - 重定向:地址栏变为最终资源的地址(如 /ceng/hello.html)。
  • 请求次数:
    - 转发:1 次请求(服务器内部跳转)。
    - 重定向:至少 2 次请求(第一次响应302,浏览器第二次请求)。
  • 数据保留:
    - 转发:共享同一个 Request 对象,request.setAttribute() 保存的数据不会丢失。
    - 重定向:新请求建立新的 Request 对象,原 Request 中的属性丢失。若需传递少量状态码或 ID,可挂载在 URL 参数后(如 ?id=1)或通过 Session/Flash Attribute 解决。
  • 作用范围:
    - 转发:仅限于当前 Web 应用内部(同一上下文)。
    - 重定向:可以跳转到任意有效 URL,包括外部网站。

最佳实践建议

  1. 查询(Read)场景:优先使用转发。例如列表页点击详情,需携带筛选条件等临时状态,转发可保持数据连贯且用户体验流畅。
  2. 写入(Write)场景:遵循 PRG 模式,先提交数据,成功后使用重定向。例如用户注册成功后,重定向到登录页,防止用户按 F5 刷新时重复提交表单。

以上就是 Spring Boot 页面跳转(重定向、请求转发)的详细内容,更多关于 Spring Boot 开发技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。