Web

[Web] 2 重定向与请求转发

重定向与请求转发区别

Posted by Mr.Vincent on 2019-06-26
Estimated Reading Time 3 Minutes
Words 911 In Total
Viewed Times

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

为什么这样说呢,这就要看两个动作的工作流程:

转发过程:转发是浏览器上的网址不变

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

重定向过程:重定向时浏览器上的网址改变

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

请求转发和重定向的区别

请求转发:转发只有一次请求

是服务器内部把对一个 request/response 的处理权,移交给另外一个。对于客户端而言,它只知道自己最早请求的那个 A ,而不知道中间的 B ,甚至 C、D 。传输的信息不会丢失。

例子:
request.getRequestDispatcher(“loginsuccess.jsp”).forward(request,response);

重定向:重定向实际上产生了两次请求

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

例子:
response.sendRedirect(“loginsuccess.jsp”);

  • 重定向:

  发送请求 –> 服务器运行 –> 响应请求,返回给浏览器一个新的地址与响应码 –> 浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址 –> 服务器运行 –> 响应请求给浏览器

  • 转发:

  发送请求 –> 服务器运行 –> 进行请求的重新设置,例如通过 request.setAttribute(name,value) –> 根据转发的地址,获取该地址的网页 –> 响应请求给浏览器

重定向时的网址可以是任何网址,转发的网址必须是本站点的网址

重定向与请求转发使用

前后两个页面有数据传递,用请求转发,没有则用重定向。

  • 比如:servlet 查询了数据需要在页面显示,就用请求转发。
  • 比如:servlet 做了 update 操作跳转到其他页面,就用重定向。

想共享信息,使用转发;想访问 WEB-INF 内容,使用转发;想跨域访问,使用重定向。


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !