Java高手速成 | 图说重定向与转发

Posted TiAmo zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java高手速成 | 图说重定向与转发相关的知识,希望对你有一定的参考价值。

 我们先回顾一下Servlet的工作原理,Servlet的工作原理跟小猪同学食堂就餐的过程很类似。小猪同学点了烤鸡腿(要奥尔良风味的),食堂窗口的服务员记下了菜单,想了想后厨的所有厨师,然后将菜单和餐盘交给专门制作烤鸡腿的厨师,这位大厨根据菜单制作出奥尔良烤鸡腿并放进餐盘,交给窗口服务员,服务员将做好的烤鸡腿交给小猪同学,小猪同学饱餐一顿后,菜单和餐盘就都被清理掉了,模拟情景的图示如图1所示。

 ■ 图1 Servlet工作原理模拟情景

上述过程对应到java中其实就是用户通过浏览器向Web服务器发出HTTP请求,服务器选择相应的Servlet响应浏览器的请求,并将响应结果返回给浏览器。服务器在选择相应Servlet的时候会出现一些问题,如果该Servlet无法完成本次请求,它会怎么处理这种情况呢?在Servlet中有两种机制可以帮助我们解决上述问题,Servlet工作原理解释如图2所示。

■ 图2 Servlet工作原理

java中转发和重定向的区别

java中转发和重定向的区别....详细。越详细越好!

转发与重定向的区别如下:

转发是服务器行为,重定向是客户端行为

1.转发在服务器端完成的;重定向是在客户端完成的

2.转发的速度快;重定向速度慢

3.转发的是同一次请求;重定向是两次不同请求

4.转发不会执行转发后的代码;重定向会执行重定向之后的代码

5.转发地址栏没有变化;重定向地址栏有变化

6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

在servlet中调用转发、重定向的语句如下:

request.getRequestDispatcher("new.jsp").forward(request,
response);//转发到new.jsp

response.sendRedirect("new.jsp");//重定向到new.jsp

转发过程:客户浏览器发送http请求,web服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求,web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

重定向,其实是两次request

第一次,客户端request
A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

参考技术A java 重定向和转发的区别
重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,request内的对象将无法使用。
转发和重定向的区别
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
参考技术B 1,请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保持,地址栏的URL地址会改变。

2,请求转发:服务器行为,request.getRequsetDispatcher().forward(requset,response);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。(服务器内部转发,所有客户端看不到地址栏的改变)

下面举个生活中的实例来说明:
请求重定向:就好比我们找一个A广告公司给设计名片,A明确告诉我们他们不会设计,就让我们找B公司,结果B公司给我设计好了,所以我们会对外宣称是B公司给我们设计的名片,(所以我们就相当于发送了两次次请求,URL地址栏里就从A变成了B公司)

请求转发:同样去找A公司给设计名片,A公司虽然不能设计但是他们接下了我们的活,把这项任务外包(转发)给B公司,最终我们会把钱给A公司,也就会对外宣称是A公司给我们设计的名片这就是请求重定向(所以我们就相当于只对A发送了一次请求,URL地址栏里依然是A公司)。
参考技术C :forward 是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递.
但forward ()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如 servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面.重定向后浏览器地址栏URL不变.

response.sendRedirect()是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,且在浏览器地址栏上会出现重定向页面的URL.sendRedirect()可以重定向有frame的jsp文件.

1、jsp:forward动作执行的是强制性跳转,写在其后面的语句不会执行。而sendRedirect()方法跳转至页面后,还会执行后面的代码;
2、jsp:forward动作是将page的值指定的页面直接送给IE。sendRedirect()方法是告诉IE要跳转页面,IE再自动调用其参数指定值的页面,其间经过三趟通讯;
3、jsp:forwart动作切断了本面与跳转页的上下文联系,而sendRedirect()方法执行跳转后,还能使用上页传递过来的信息。
参考技术D 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。
怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。
转发和重定向的区别
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

以上是关于Java高手速成 | 图说重定向与转发的主要内容,如果未能解决你的问题,请参考以下文章

java中转发和重定向的区别

面试JAVA基础Web与网络

java web开发中的转发和重定向问题的理解,要的是理解

JavaWeb-Servle介绍

java重定向时如何保持地址栏不变

jsp初识servlet转发转发与重定向的比较