Spring Boot 页面跳转:重定向与请求转发详解及代码示例
在 Spring Boot 开发中,Controller 向视图层返回结果时,常需处理页面跳转。掌握请求转发与重定向的区别对于构建健壮的应用至关重要。本文将分析两者的底层行为差异,提供标准的 Java 实现代码,并明确何时使用转发以保留数据,何时使用重定向以防止表单重复提交。
准备条件:注解与模板限制
在深入具体跳转逻辑前,需明确 Spring Boot 对页面访问的基础约束:
- Controller 注解选择:若目标是通过返回字符串解析为 HTML 页面跳转,必须使用
@Controller。若误用@RestController,其隐含的@ResponseBody会将返回值视为 JSON 或纯文本直接输出到浏览器,导致无法触发页面跳转。 - 模板引擎路径限制:默认配置下,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,包括外部网站。
最佳实践建议
- 查询(Read)场景:优先使用转发。例如列表页点击详情,需携带筛选条件等临时状态,转发可保持数据连贯且用户体验流畅。
- 写入(Write)场景:遵循 PRG 模式,先提交数据,成功后使用重定向。例如用户注册成功后,重定向到登录页,防止用户按 F5 刷新时重复提交表单。
以上就是 Spring Boot 页面跳转(重定向、请求转发)的详细内容,更多关于 Spring Boot 开发技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













