重定向和请求转发详解
重定向和请求转发详解
摘要:这篇笔记着重介绍了重定向和请求转发这两个请求方式的区别、各自的特点。
1.请求转发
请求转发本身是一种服务器行为,其本质是客户端请求到达服务端之后,服务端将这个请求信息进行一个转发并且将请求转发的对象进行保存,此时如果我们使用的是浏览器,会发现浏览器上方的URL路径栏中的路径是没有变化的。这是一种服务器的内部行为,是一个servlet将一个请求转发给服务器内部的另一个servlet的行为,这种跳转只能在服务器内部发生,也就是说只能将请求转发到一个位于该服务器内部的资源中,而不能转发到外部,这个和服务器内部的请求信息保存方式有关。接下来我们使用图解来描述请求转发的过程:
我们在客户端中向服务端发出请求,首先需要使用URL进行一次路径构建,建立好连接之后我们才可以发送我们的请求,这是一个计算机网络相关的知识,我们在进行网络通信之前,首先会通过某种方式建立起一个连接,然后再进行数据传输,数据传输中的主体就是我们发出的请求,我们的请求在服务器外部实际上没有一种规范化的保存格式,它们就是网线上的电信号或者光信号,此时他们位于物理层,物理层的数据不能被应用层的应用直接识别,但是它们可以通过链路层协议被指定的服务器接收,被服务器接收之后,自然就需要驱动和操作系统的处理,然后发送到Tomcat了,在接收到信息之后Tomcat会将这些请求信息转化为HttpServlet格式保存在自身进程之中,并且根据其请求目标进行发送,如上图它被发送给了ServletA,ServletA是一个Servlet,在Servlet中,要求请求被转化为HttpServletRequest的格式,因此这里还存在一次格式转化,而ServletA发现其中存在请求转发的操作,于是执行相关代码,Tomcat就会将这个请求对象进行格式转换,先转换为HttpServlet的格式,然后再转发给另一个Servlet。在这个过程中,HttpRequest不能被转化为Request,而只能是在HttpServletRequest与HttpRequest两个状态间转换,因为Tomcat不提供将内部格式重新变为Request格式的功能,因此,请求转发不能向外部资源跳转,并且是客户端对服务端的一次请求。
请求转发是一种服务器端行为,和用户无关,完全由服务端实现。
2.重定向
重定向和请求转发都可以实现页面跳转的功能,但是我们在学习他们的时候也就是止步于此了,顶多知道重定向会让URL发生改变,而对于资源的请求也不能再使用之前页面的相对路径方式,只能是重新以当前的页面为出发点进行请求了。这是为什呢,我们用图解的方式来看看重定向的原理:
在重定向中,使用到了另一个对象,Response对象,这个对象是专门向客户端返回信息用的,使用重定向的时候,Servlet没有再继续向下跳转,而是使用HttpServletResponse对象向客户端进行了返回,它将ServletB的地址返回给了客户端,然后让客户端去重新访问这个地址,于是客户端就又发出了一次请求,这次请求是直接向ServletB的请求。这就解释了为什么我们使用重定向的时候,URL会发生改变,因此我们重新发送了一次请求,重定向是一个二次请求,和请求转发是不同的,与此同时,ServletA返回的这个地址不一定是服务器内部资源地址,也可以使一个站外地址,这样一来就能实现站外资源的跳转。
请求转发不是单纯的服务端行为,而是一种服务器端指导的客户端行为。
3.总结
在使用浏览器观察的时候我们能够发现请求转发是只有一次请求,而重定向则出现了二次请求,二者各有利弊,重定向的时间更长,并且需要重新定位资源,请求转发时间稍短,但是只能访问站内资源,通常我们在书写站内网页跳转的时候不会使用重定向,这是为了避免因为重新定位资源引起的麻烦,当然我们对于资源的访问使用绝对定位的方式也是不碍事的,这里只能说是根据具体情况做选择了。