这个问题在面试的时候经常会被问到,主要是考察下面的三个方面的只是。
- 请求转发的含义;
- Forward转发请求的原理;
- Redirect转发请求的原理。
Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。
直接转发(Forward)方式,客户端和浏览器只发出一次请求,servlet ,html,jsp或其他信息资源,由第二个信息资源响应该请求,在请求对象request 中,保存的对象对于每个信息资源都是共享的。
间接转发(redirect)方式,实际上是两次HTTP的请求,服务端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。
下面是解析两个的原理:
间接转发(redirect):有时候也叫重定向,它一般用于避免用户的非正常访问。例如:在用户没有登录的情况下访问后台资源,servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。在Servlet中,通过调用request对象的SendRedirect()方法,告诉浏览器重定向访问制订的URL。
比如有两servlet
1浏览器向Servlet1发出访问请求;
2Servlet1 调用sendRedirect()方法,将浏览器重定向到Servlet2;
3浏览器向Serlvet2发出请求;
4最终由Servlet2做出响应。
直接转发(Forward):
直接转发的方式使用的比较多一些,一般说的请求转发指的是直接转发的方式,Web 应用程序大多会有一个Controller,由controller来控制请求应该转发给那个信息资源,然后由这些信息资源进行处理请求。处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。javax.serlvet.RequestDispatcher接口是请求转发器必须实现的接口,由Web容器为Servlet提供实现该接口的对象,通过调用该接口的forward()方法到达请求转发的目的
1:浏览器向Servlet1发出访问请求;
2:Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;
3:最终由Servlet2做出响应。
面试可能会问:直接转发跟间接转发的的原理及区别是什么?
答:forward和redirect 代表着两种不同的请求转发方式,对应到代码里,分别RequestDispatcher类的forward()方法和HttpServletRequest类的sendredirect()方法。
对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。他本质上是两次Http请求
,对应着两个request对象。
对于直接方式,客户端浏览器只发出一次请求,servlet把请求转发给Servlet,html,jsp或其他信息资源,由第2个信息资源响应该请求,两个信息资源是共享一个request对象的。