`

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)重定向相对慢:因为重定向过程发生在两个不同的请求中。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics