面试题系列之Servlet API中forward()与redirect()的区别

概念

forward()与redirect()是servlet的两种主要的跳转方式。forward又叫转发,redirect叫做重定向。
转发过程:客户浏览器发送http请求——>web服务器接受此请求—>调用内部的一个方法在容器内部完成请求处理和转发动作一>将目标资源发送给客户端;
在这里,转发的路径必须是同一个web容器下的URL,其不能转向到其他的web路径上去,中间传递的 是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
forword转发
重定向过程:客户浏览器发送http请求一一>web服务器接受后发送302状态码响及对应新的location给客户浏览器——>客户端浏览器发现是302状态码,会自动再发送一个新的http请求,请求url是新的location地址一一>服务器根据此请求寻找资源并发送给客户端浏览器在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器地址栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
redirct重定向

区别:

  1. 从地址栏显示来说:
    forward是服务器内部的重定向,服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。
    redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示的是新的URL。
    所以redirect等于客户端向服务器端发出两次request,同时也接受两次response;而forword只有一次请求。
  2. 从数据共享来说
    forward:forward方法只能在同一个Web应用程序内的资源之间转发请求,是服务器内部的一种操作。由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的jsp或者servlet中使用,所以可以共享数据。
    redirect:redirect是服务器通知客户端,让客户端重新发起请求。redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。所以不能共享数据。
  3. 从应用场景来说
    forward:一般适用于用户登陆的时候,根据角色转发到相应的模块。
    redirect:一般适用于用户注销登陆时返回主页面和跳转到其它的网站等.
  4. 从效率来说
    forward:效率高。
    redirect:效率低.
  5. 从本质来说:
    forword转发是服务器上的行为,而redirect重定向是客户端的行为。

举个栗子

其实很多的知识都可以用生活中的实例进行比喻,方便记忆。所以这里可以举个栗子。
比如你钱包掉了,你去派出所问有没有人捡到交到派出所。结果警察跟你说,是有人捡到了但是钱包不在派出所,还在那个人那里。
如果警察说你别动,你在派出所等会我去给你拿,然后警察去那个人家里把钱包给你取来了,交到你手上,这就是转发。
如果警察给了你那个人的地址,让你去那个人的家里自己去拿,这个就是重定向。

猜你喜欢

转载自blog.csdn.net/qq_41153943/article/details/106127943
今日推荐