Servlet中请求转发和重定向的原理及区别

1、定义

 

    1Forward(请求转向):服务器程序内部请求转向,这个特性允许前一个程序用于处理请求,而后一个程序用来返回响应。

    2Redirect(重定向):服务端发送给客户端一个重定向的临时响应头,这个响应头包含重定向之后的URL,客户端用新的URL重新向服务器发送一个新的请求。

 

2、定义简单理解

 

   1)请求转发只是把请求转发给服务器上(通常是同一个Web应用中)的另一个组件(ServletJsp等)。

    2)重定向则只是告诉客户(浏览器)去访问另一个URL(可能是同一个Web站点甚至其他站点)。

 

3、本质区别

 

    1)请求转发发生在服务器端,由服务器(比如servlet)控制。

    2)重定向发生在客户端,由客户(通常是浏览器)控制。

 

4、请求和响应次数

 

    1)请求转发过程在同一个请求当中完成,只会返回一个响应。

    2)重定向过程则发生在两个不同的请求中,会返回两个不同响应。

 

5、基于第4点,进一步分析

 

    1)请求转发后可以在服务器端获取本次请求对象上保存的信息(比如在Servlet中将用户名保存到当前request对象中,转发给另一组件(如JSP)后,另一组件可以通过request对象取得用户名信息)。

    2)请求转发后,浏览器地址栏URL不会发生改变。

    3)重定向后则无法在服务器端获取第一次请求对象上保存的信息(比如还是在Servlet中将用户名保存到当前request对象中,并重定向到一个新的URL,然后在新URL指向的地址中(比如还是某个Servlet)就无法获取原先保存在第一个请求中的信息。很明显,用户名是保存在第一次请求的对象中,但并没有保存在本次(第二次)请求的对象中)。

    4)重定向后,浏览器地址栏URL变为新的URL(因为浏览器确实给新的URL发送了一个新的请求)。

 

6、服务器端调用的方法

 

    1)请求转发使用RequestDispatcher对象的forward()include()方法(他们的区别可参考:Servlet中请求转发时forword()include()的区别)。

    2)重定向则使用HttpServletResponse对象的sendRedirect()方法。

 

7、基于第6点,进一步分析

 

    1)RequestDispatcher对象是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,所以forward()include()本质来说是属于请求对象的方法,所以请求转发始终发生在一个请求当中。

    2)sendRedirect()方法HttpServletResponse对象的方法,即响应对象的方法。既然调用了响应对象的方法,就表示本次请求过程已经结束了,服务器即将向客户端返回本次请求的响应了。事实上,服务器确实返回了一个状态码为“302”,首部“Location”值为新的URL的响应。然后浏览器就会根据“Location”首部指定的URL,重新发起一次新的请求,转向这个目标页面,所以重定向实际上发生在两个不同的请求当中。

 

8、sendRedirect()forword()中使用相对URL分析(站点为http://localhost:8080/Web应用为MyApp)

 

    1)sendRedirect(URL):如果使用”/”开头,则表示相对于整个Web站点的根目录,如使用sendRedirect(“/foo/myHtml.html”)时,容器建立的完整URL为:http://localhost:8080/foo/myHtml.html。否则,就表示相对于当前目录。

    2)request.getRequestDispatcher(URL).forward(req,res):如果使用”/”开头,则表示相对于当前Web应用的根目录,而非整个Web站点的根目录,如使用request.getRequestDispatcher(/foo/myHtml.html).forward(req,res)时,容器会建立绝对(完整)的URL为:http://localhost:8080/MyApp/foo/myHtml.html否则,同样表示相对于当前目录。

 

9、跳转时机(有待考究

 

    1)请求转发执行到跳转语句后马上无条件跳转,之后的代码不再执行。

    2)重定向则会在所有代码执行完毕后跳转,但不能再向response中写入任何数据。(可以在重定向跳转后加上return语句,实现马上跳转)

 

10、执行时机(相同点)

 

    1)请求转发和重定向方法都必须在响应提交(刷新响应正文输出到流中)之前执行,否则会抛出IllegalStateException异常。

    2)在转发或重定向之前,响应缓冲区中未提交的数据会被自动清除。

 

11、响应速度(理论上)

 

    1)请求转发相对快:因为请求转发过程在同一请求中。

    2)重定向相对慢:因为重定向过程发生在两个不同的请求中。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请求转发重定向都是HTTP协议常用的两种跳转方式,它们的区别在于跳转的方式不同。请求转发是在服务器端进行的跳转操作,而重定向则是在客户端进行的跳转操作。下面我将分别介绍两种跳转方式的流程和原理。 ## 请求转发 请求转发是指在服务器端将一个请求转发给另一个资源进行处理。在这个过程,浏览器只发起了一次请求,服务器端将这个请求转发给了另一个资源,并将处理结果返回给浏览器。 请求转发的流程如下: 1. 浏览器向服务器发送请求。 2. 服务器接收到请求后,根据请求的URL地址找到对应的Servlet或JSP。 3. Servlet或JSP处理请求,生成响应结果。 4. Servlet或JSP将响应结果转发给另一个Servlet或JSP进行处理。 5. 最后,另一个Servlet或JSP将处理结果返回给浏览器。 请求转发原理是通过request对象的forward()方法实现。具体来说,当Servlet或JSP处理请求时,可以通过request对象获取到ServletContext对象,通过ServletContext对象获取到RequestDispatcher对象,然后通过RequestDispatcher对象的forward()方法将请求转发给另一个Servlet或JSP进行处理。 ## 重定向 重定向是指在客户端浏览器发起一个新的请求,请求的URL地址指向另一个资源。在这个过程,浏览器会向服务器发送两次请求,第一次请求是原始请求,第二次请求是重定向后的请求。 重定向的流程如下: 1. 浏览器向服务器发送请求。 2. 服务器接收到请求后,根据请求的URL地址找到对应的Servlet或JSP。 3. Servlet或JSP处理请求,生成响应结果。 4. Servlet或JSP将响应结果返回给浏览器,并在响应头设置Location属性,指向另一个资源。 5. 浏览器收到响应后,根据Location属性的值向服务器发送另一个请求,请求的URL地址指向重定向后的资源。 6. 服务器接收到新的请求后,根据请求的URL地址找到对应的资源。 7. 最后,服务器将处理结果返回给浏览器。 重定向原理是通过response对象的sendRedirect()方法实现。具体来说,当Servlet或JSP处理请求后,可以通过response对象的sendRedirect()方法设置Location属性,然后将响应结果返回给浏览器。浏览器收到响应后,会根据Location属性的值向服务器发送另一个请求,请求的URL地址指向重定向后的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值