页面跳转有两种实现方式:请求转发和页面重定向。
请求转发(forward)
请求转发可以理解成是服务器端的行为。客户端发起一次请求,这个请求在整个服务端可以被多次传递,但都是由服务器端的处理程序传递给另一个处理程序,客户端不需要发起二次请求,无论这个请求经历过多少个处理程序,始终都是同一个请求,也就意味着,这个请求中的数据经历过的每一个程序都可以使用。在同一个请求中request范围中的数据不会丢失。
当使用了请求转发后,在客户端浏览器地址中不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求当中(请求对象只有一个)。
页面重定向(redirect)
可以理解为是客户端的行为,客户端发起一次请求,服务端给出一次响应,但这个响应包含下一次客户端需要访问的服务器端处理程序的地址,客户端再次发起请求,将会得到处理结果,也就意味着重定向客户端至少发起两次请求。两次请求中request范围中的数据丢失。
当使用了重定向跳转页面后,在其客户端路径栏显示的应该是其重定向的路径,客户端是可以观察到页面地址变化的。
发送请求的方式(简单的重定向):
(1)浏览器地址输入链接
(2)a标签
<a href="URL地址">跳转</>
(3)form表单
<form action="URL地址" method="get/post">
<input type="submit" value="跳转">
</form>
(4)通过js的BOM操作
<script>
alert("点我以后页面重定向")
window.location.href="https://www.baidu.com"
</script>
(5)Ajax异步请求
二者区别
(1)请求次数:请求转发是一次请求,重定向至少请求两次;
(2)地址栏不同:请求转发的地址栏不会发生改变,重定向的地址栏会发生改变;
(3)是否共享数据:请求转发(一次请求)可以共享请求参数,重定向后(两次请求),就获取不了共享参数了;
(4)跳转限制:重定向可以跳转到任意URL,请求转发只能跳转本站点资源;
(5)发生行为不同:重定向是客户端行为,请求转发是服务器端行为。
(6)速度:重定向的速度比请求转发慢,因为浏览器还得发出一个新的请求,如果在使用转发和重定向都无所谓的时候建议使用转发。
使用场景
- 如果需要共享请求中的数据,只能用请求转发;
- 若要跨域访问,只能用重定向;
- 请求转发可能造成表单重复提交问题;
- 开发阶段用户登录可以使用请求转发,提高开发效率,但是上线后需要改为重定向。