转发与重定向的区别及详解
核心区别
特性 | 转发(Forward) | 重定向(Redirect) |
---|---|---|
请求次数 | 1次(服务器内部跳转) | 2次(客户端重新发起请求) |
地址栏变化 | 不变化 | 变化 |
代码示例 | request.getRequestDispatcher("/index").forward(request, response); |
response.sendRedirect("/webapp/index"); |
资源访问范围 | 可访问WEB-INF 目录下的资源 |
无法直接访问WEB-INF 目录下的资源 |
跨域/外部跳转 | 仅限服务器内部资源 | 支持跨域或外部资源跳转 |
详细说明
-
请求与响应流程
-
转发:
-
客户端发送请求到
AServlet
,服务器内部转发到BServlet
,最终返回响应。 -
浏览器地址栏始终显示初始请求(如
/a
)。
-
-
重定向:
-
客户端发送请求到
AServlet
,服务器返回302
状态码和新地址(如/b
)。 -
浏览器自动发起第二次请求到新地址,地址栏显示
/b
。
-
-
-
资源访问限制
-
WEB-INF
目录下的资源(如JSP)对客户端隐藏,只能通过服务器内部转发访问。 -
重定向由浏览器发起新请求,无法直接访问
WEB-INF
资源。
-
-
适用场景
-
转发:
-
需要共享请求数据(通过
request.setAttribute
)。 -
隐藏资源路径(如跳转到受保护的页面)。
-
-
重定向:
-
防止表单重复提交(如提交后跳转到结果页)。
-
跨域跳转(如从
http
跳转到https
)。
-
-
总结:转发适合服务器内部资源跳转且需保留请求数据,重定向适合跨域或防止重复提交的场景。在Spring MVC中,合理使用配置可简化视图和静态资源管理。
在springMVC中如何完成转发和重定向
当return a 时候返回了一个逻辑视图名称,这种方式跳转到视图,默认采用的就是forward方式跳转
@RequestMapping("/a")
public String toA() {
//重定向使用较多
return "a";
}
转发语法格式是什么
注: 底层创建的是InternalResourceView对象
java
@RequestMapping("/a")
public String toA() {
//转发的时候格式有特殊要求
//return "forward:转发到下一个资源的路径";
//这个就不是逻辑视图名称了,是以转发的方式跳转是一个资源的路径
return "forward:/b";
}
重定向语法格式
注: 这是两次请求。底层创建的是RedirectView对象
javascript
@RequestMapping("/a")
public String toA() {
//重定向使用较多
//转发的时候格式有特殊要求
//return "forward:转发到下一个资源的路径";
//这个就不是逻辑视图名称了
return "redirect:/b";
}
重定向跨域写全路径,例如:
javascript
@RequestMapping("/springmvc")
public String toB() {
//重定向使用较多
//转发的时候格式有特殊要求
//return "forward:转发到下一个资源的路径";
//这个就不是逻辑视图名称了
return "redirect:http://localhost:8088/springmvc2/b";
}