Spring MVC中直接返回视图名与redirect:/跳转的差异及代码疑问
Spring MVC两种返回方式的核心区别
你代码里的两种返回逻辑,本质是Spring MVC的请求转发(Forward)和重定向(Redirect),核心区别体现在这几个方面:
1. 请求流程与地址栏表现
return "test3"是请求转发:
服务器内部直接把当前请求(/test2)的处理权转交给test3对应的视图,全程浏览器只发1次请求,地址栏始终显示/test2,不会变化。return "redirect:/test2"是重定向:
服务器会返回一个302状态码,告诉浏览器“去请求新的地址/test2”,浏览器会发起第2次请求,地址栏会从/test3变成/test2。
2. 方法触发与日志输出
结合你的代码实际运行:
- 访问
/test2时,只会执行test2()方法,打印redirected 1,不会触发test3()方法(因为转发是服务器内部跳转,不是浏览器主动请求/test3)。 - 访问
/test3时,先执行test3()方法打印redirected 2,然后浏览器收到重定向指令,再请求/test2,触发test2()方法打印redirected 1,相当于两次方法调用。
3. 数据传递的差异
- 转发:同一个请求上下文,
Model里的参数可以直接传递到目标视图,不需要额外处理。 - 重定向:原请求的
Model数据会丢失,因为是两个独立的请求。如果要传数据,得用RedirectAttributes.addFlashAttribute()(临时存到会话,取一次就失效),或者把数据拼在URL参数里。
4. 视图解析逻辑
- 转发:会走你配置的
View Resolver,把返回的字符串test3拼接成实际的JSP路径(比如前缀/WEB-INF/jsp/+test3+后缀.jsp),直接返回视图内容。 - 重定向:Spring会识别
redirect:前缀,不会走View Resolver,而是生成重定向响应头,让浏览器重新发起请求,后续的视图解析是新请求触发的。
内容的提问来源于stack exchange,提问作者KUNAL HIRANI
相关产品推荐
相关产品推荐

