用户向服务器发送了一次HTTP请求,该请求肯能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的。根据转发方式的不同,可以区分为直接请求转发(Forward)和间接请求转发(Redirect)两种。
Forward和Redirect代表了两种请求转发方式:转发和重定向
转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于一个每个信息资源是共享的。
重定向方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。
举个通俗的例子:
转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;
重定向就相当于:"A找B借钱,B说没有,让A去找C借"。
转发(Forward)
转发方式用的更多一些,一般说的请求转发指的就是直接转发方式。Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。
javax.serlvet.RequestDispatcher接口是请求转发器必须实现的接口,由Web容器为Servlet提供实现该接口的对象,通过调用该接口的forward()方法到达请求转发的目的。
在Web服务器端处理用户请求的时候,会有需要多个Web组件配合才能完成的情况。一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续完成,这个转交的过程叫做转发。
常见情况是Servlet负责获取数据,然后将数据转交给JSP进行展现。
如何实现转发
步骤一、绑定数据到request对象
- request.setAttribute(String name,Object obj);
步骤二、获得转发器
如下代码可以获取到转发器,用于说明转交的下一个组件的路径:
- RequestDispatcher rd = request.getRequestDispatcher(String uri);
使用转发器完成转发的动作,因下一个Web组件要针对同一个请求和响应继续完成后续的工作,所以在转发时要将本次的请求和响应对象作为参数传给下一个Web组件。实现代码如下所示:
- rd.forward(request,response);
- request.getRequestDispatcher(String uri).forward(request,response);
上图所示的直接转发请求的过程如下:
- 浏览器向Servlet1发出访问请求;
- Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;
- 最终由Servlet2做出响应。
重定向(Redirect)
重定向,它一般用于避免用户的非正常访问。例如:
用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问
。在Servlet中,通过调用
response对象的SendRedirect()方法,告诉浏览器重定向访问指定的URL
如何重定向
由于发回的响应信息由response对象控制,所以使用如下代码即可实现重定向的过程:- response.sendRedirect(String url);
重定向特点
由于重定向动作的执行者为浏览器,所以请求的地址可以是任意地址,哪怕是当前应用以外的应用;浏览器发出请求时一定会保持地址栏与目标地址的一致,所以发生重定向时可以从地址栏中看到地址的改变;由于整个跳转过程是在浏览器收到响应后重新发起请求,所以涉及到的Web组件并不会共享同一个request和response。
上图所示的间接转发请求的过程如下:
- 浏览器向Servlet1发出访问请求;
- Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2;
- 浏览器向servlet2发出请求;
- 最终由Servlet2做出响应。