一. 前言
我们知道,Web开发中的页面跳转,通常有两种跳转方式:重定向与请求转发。但可能有很多同学并不知道这两种跳转在细节上的区别,只知道都能跳转到目标页面。但实际上这两种跳转方式深入研究后,你会发现有很多不同之处。接下来,壹哥就给大家梳理一下这两种跳转方式的具体区别。
二. 两者的各自特点
两种跳转最大的区别在于,重定向是两次请求,每次都是从客户端发起;而请求转发是一次请求,是服务器发起的转发。如下图所示:
给大家举一个生活中的案例:
重定向:我要找凤姐办事,凤姐说她完成不了,刘亦菲可以完成这件事,让我去找刘亦菲办事。也就是说,我需要再重新发送一次请求,去找刘亦菲办事。
请求转发:我要找凤姐办事,凤姐说她完成不了,她帮我找能完成这件事的人,然后完成了这件事,我只需要发一次请求即可。
三. 具体区别
除了上述区别之外,重定向后,url路径会改变;转发不会改变url路径,还是原先的访问路径,在应用中往往增删改使用重定向。比如我们在使用完增删改后,如果路径不改变,则继续刷新,会出现增删改异常;而查询需要使用转发,转发后,可实时变更使用request传值。
然后是对内和对外跳转的区别,对于外部跳转,必须使用重定向,转发则不可对外跳转。例如使用转发跳转到百度页面,是不允许的。这是由转发特点所决定的,转发是一次跳转,两个不同服务器之间,是不可能共用同一个请求对象的。对内部安全页面跳转则必须使用转发,例如转发到内部WEB-INF下的安全页面,则必须使用转发,使用重定向则访问不了。
另外关于在过滤器中的跳转应用,在过滤器中,如果使用转发后,则不会进入过滤器中。因为转发是一次请求,进入服务器后,已经经过了过滤器。当进行转发后,没有重新发请求,则不会再进入到过滤器中。如果是重定向,则是重客户端重新发的请求,则还是会进入过滤器,再访问目标资源。
最后Web项目加入上下文路径,以及多级路径的跳转区别。如果加入了上下文路径,访问映射路径有多级的话,则不能使用相对路径进行跳转,需要使用绝对路径,也就是跳转路径前面必须加“/”标识。使用重定向时,绝对路径是基于站点路径,没有带上下文路径,必须手动加上request.getContextPath()。如果转发跳转,则绝对路径是基于上下文路径,无需加上下文路径。
四. 总结
以上所述,就是重定向与转发的比较典型的几个特点与应用上的区别。我们需要在使用跳转时,多加应用和练习,这样才能把这些区别都了解清楚。现在你知道两者的区别有哪些了吗?如果你还有其他的答案,可以在评论区告诉我哦。