在上一篇文章中,用到了请求转发和重定向,但是,我仅仅只是知道他俩是怎么用的,有哪一些区别,如果你问我为什么,我也是懵逼的,现在给大家整理一下他们的区别和使用,最后来说明为什么。
先上个栗子。

重定向:

haproxy请求转发打印 请求转发原理_selvet


想必大家都用过,直接会重定向到main.html页面,而且重定向是二次转发,不会带原来的参数,地址栏也会改变。

这是为什么呢?我们来分析它的工作原理。

HTTP协议规定了一种重定向机制,重定向的运作流程如下:
(1)用户在浏览器端输入特定URL,请求访问服务器端的某个组件。
(2) 服务器端的组件返回一个状态码为302的响应结果,该响应结果的含义为:
让浏览器端再请求访问另一个Web组件,在响应结果中提供了另一个Web组件的URL。另一个Web组件有可能在同一个Web服务器上,也有可能不再同一个Web服务器上。
(3) 当浏览器端接收到这种响应结果后,再立即自动请求访问另一个Web组件。
(4) 浏览器端接收到另一个Web组件的响应结果。

这就是为什么重定向有上述特性的原因了。注意以下两点:源组件和目标组件不共享同一个ServletRequest对象,因此不共享请求范围内的共享数据。
如果以“/”开头,表示相对于当前服务器根路径的URL,如果以http://开头,表示一个完整的URL。

haproxy请求转发打印 请求转发原理_Web_02


我们接着来分析请求转发

先上图

haproxy请求转发打印 请求转发原理_重定向与请求转发_03


我们先说一下它的特性和用法再来分析它的工作原理

请求转发地址栏不变,可共享request域中的数据。只发送一次请求,/后的path路径既可以是绝对路径也可以是相对路径。基本上就是这个常用的特性。我们来看看它的工作流程。先上个图吧,比较一目了然

haproxy请求转发打印 请求转发原理_java_04


我们客户端发送一次请求,只有目标组件得到的响应结果才会被返回给客户端。也就是说服务器会自动给我们处理后面的请求。因此无论转发多少次,还是同一个request对象。

别人要是问你我觉得你现在应该回答的上来了吧。