再谈Redirect(客户端重定向)和Dispatch(服务器端重定向) (转载) 让我理解了很多困惑,好文

这是两个常常被放在一起进行比较的概念,今天对这两个概念再重新回顾一下,前者发生在客户端(浏览器),后者发生在服务器端?,因此也有人把前者称为客户端重定向,把后者称为服务器端重定向,虽然对于后者这种称谓并不算贴切。本文原文链接:http://blog.csdn.net/bluishglc/article/details/7953614 转载请注明出处!
 
Redirect(客户端重定向)
 
标准意义上的“重定向”指的是HTTP重定向,它是HTTP协议规定的一种机制。这种机制是这样工作的:(没有涉及request,只有response)
  1. 当client向server发送一个请求、要求获取一个资源时,
  2. 在server接收到这个请求后发现请求的这个资源实际存放在另一个位置
  3. 于是server在返回的response中写入那个请求资源的正确的URL,设置reponse的状态码为301(表示这是一个要求浏览器重定向的response)
  4. 当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都是在基于同一份资源(同一组request和response对象)完成它们职责范围之内的计算。

 

 

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

posted on 2016-06-25 14:47  雪的心  阅读(4055)  评论(0编辑  收藏  举报

导航