再谈Redirect 客户端重定向 和Dispatch 服务器端重定向

               
这是两个常常被放在一起进行比较的概念,今天对这两个概念再重新回顾一下,前者发生在客户端(浏览器),后者发生在服务器端,因此也有人把前者称为客户端重定向,把后者称为服务器端重定向,虽然对于后者这种称谓并不算贴切。本文原文链接: http://blog.csdn.net/bluishglc/article/details/7953614 转载请注明出处!

Redirect(客户端重定向)

标准意义上的“重定向”指的是HTTP重定向,它是HTTP协议规定的一种机制。这种机制是这样工作的:当client向server发送一个请求,要求获取一个资源时,在server接收到这个请求后发现请求的这个资源实际存放在另一个位置,于是server在返回的response中写入那个请求资源的正确的URL,并设置reponse的状态码为301(表示这是一个要求浏览器重定向的response),当client接受到这个response后就会根据新的URL重新发起请求。重定向有一个典型的特症,即,当一个请求被重定向以后,最终浏览器上显示的URL往往不再是开始时请求的那个URL了。这就是重定向的由来。



http重定向的一种典型应用是防止表单重复提交,其原理是:假如当前是一个用户信息编辑页面,表单通过Post提交给saveUser.action, 当该请求提交后,可返回一个重定向的response,地址可以是viewUser.action,即定向到用户详情页面(不能修改和提交)。当然这种防止页面重复提交的方法作用是有限的, 如果用户返回表单页面,重新提交表单,或是用户在服务器端响应到达之前,多次点击提交按钮(可通过JavaScript控制提交按钮点击次数)等等。

在Servlet里,实现客户端重定向的方法是:response.sendRedirect()

Dispatch(服务器端重定向)

Dispatch(Forward)指的是服务器在处理request的过程中将request先后委托多个servlet或jsp接替进行处理的过程。最为常见的是先由一个Servlet处理(比如实现业务逻辑的计算),然后forward给一个JSP进行视图的渲染。在Servlet里,实现dispatch是通过RequestDispatchers来实现的,而这个类有两个方法,一个是forward,另一个是include,相应的在JSP里实现dispatch的标签也有两个:<jsp:forward/>和<jsp:include/>.    不管是forward还是include,我们可以清楚的看到,从一个servlet或jsp向别一个servlet或jsp跳转,request和reponse始终在期间传递,这是服务器端能实现dispatch模式的关键。换句话说,我们可以把request和reponse看作是一种资源,一系列的servlet和jsp都是在基于同一份资源完成它们职责范围之内的计算。



注:此图原图引自《Head First Servlets and JSP》