forward() 与redirect()的区别

用户向服务器发送了一次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对象
在转交的过程中一定会有数据的传递,并且涉及到的Web组件都是针对同一个请求,所以 利用request来保存共同处理的数据不仅仅能让数据共享,也能够随着请求响应的结束而销毁,不会占用服务器更多的资源 。使用如下代码可以实现数据的绑定:

  1. request.setAttribute(String name,Object obj);
setAttribute()方法实现数据绑定 ,与其对应的还有 getAttribute()方法获取绑定的数据 removeAttribute()方法移除绑定的数据

      步骤二、获得转发器

如下代码可以获取到转发器,用于说明转交的下一个组件的路径:

  1. RequestDispatcher rd = request.getRequestDispatcher(String uri);
     步骤三、实现转发

使用转发器完成转发的动作,因下一个Web组件要针对同一个请求和响应继续完成后续的工作,所以在转发时要将本次的请求和响应对象作为参数传给下一个Web组件。实现代码如下所示:

  1. rd.forward(request,response);
其中步骤二和步骤三可以合并为一行代码:

  1. request.getRequestDispatcher(String uri).forward(request,response);

上图所示的直接转发请求的过程如下:

  1. 浏览器向Servlet1发出访问请求;
  2. Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;
  3. 最终由Servlet2做出响应。

重定向(Redirect)

重定向,它一般用于避免用户的非正常访问。例如: 用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问 。在Servlet中,通过调用 response对象的SendRedirect()方法,告诉浏览器重定向访问指定的URL

如何重定向

由于发回的响应信息由response对象控制,所以使用如下代码即可实现重定向的过程:
  1. response.sendRedirect(String url);

重定向特点

由于重定向动作的执行者为浏览器,所以请求的地址可以是任意地址,哪怕是当前应用以外的应用;浏览器发出请求时一定会保持地址栏与目标地址的一致,所以发生重定向时可以从地址栏中看到地址的改变;由于整个跳转过程是在浏览器收到响应后重新发起请求,所以涉及到的Web组件并不会共享同一个request和response。


上图所示的间接转发请求的过程如下:

  1. 浏览器向Servlet1发出访问请求;
  2. Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2;
  3. 浏览器向servlet2发出请求;
  4. 最终由Servlet2做出响应。 
技巧:  其实,通过浏览器就可以观察到服务器端使用了那种请求转发方式,当单机某一个超链接时, 浏览器的地址栏会出现当前请求的地址,如果服务器端响应完成以后,发现地址栏的地址变了,则证明是重定向 。相反, 如果地址没有发生变化,则代表的是转发或者没有转发

直接转发和间接转发的原理及区别是什么?
Forward和Redirect代表了两种请求转发方式:转发和重定向。对应到代码里,分别是RequestDispatcher类的forward()方法HttpServletRequest类的sendRedirect()方法。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值