转发:
转发是服务器处理web请求时,一个Web组件通过容器将未完成的请求交给另外一个Web组件继续完成,这个过程叫做转发,通常Servlet负责处理数据,JSP负责展现
转发过程发生在服务器端,客户端只发送了一个请求,虽然请求到达服务器的指定位置后被容器控制着传到了第二个组件继续完成工作,但浏览器并不知道这个过程,所以转发之后地址栏地址不会发生变化。
转发的目的地必须是同一个应用内部的某个地址,决不能跳出应用。毕竟这个转交过程由容器实现,容器只有访问本应用的权限,而不能控制请求到达应用以外的位置。
转发过程中涉及到的所有Web组件共享同一个request对象和response对象,数据的传递和共享就依赖request对象。
重定向:
在服务器为浏览器提供响应时,回传的状态行是302状态码,浏览器遇到302状态码后,会按照内含头信息中的url地址再发送一次请求,这次请求时浏览器发出的所以地址栏会改变。由于重定向动作的执行者为浏览器,所以请求的地址可以是任意地址,哪怕是当前应用以外的应用;浏览器发出请求时一定会保持地址栏与目标地址的一致,所以发生重定向时可以从地址栏中看到地址的改变;由于整个跳转过程是在浏览器收到响应后重新发起请求,所以涉及到的Web组件并不会共享同一个request和response。
转发和重定向的区别
重定向:浏览器发送请求到容器访问A,A可以发送一个状态码302和一个Location消息头到浏览器,于是浏览器会立即向Location发新的请求。
转发:浏览器发送请求到容器访问A,A可以通知容器去调用B。转发所涉及的各个Web组件会共享同一个request和response对象;而重定向不行。
说明:当请求到达容器,容器会创建request对象和response对象。当响应发送完毕,容器会立即删除request对象和response对象。即,request对象和response对象的生存时间是一次请求与响应期间。
转发之后,浏览器地址栏的地址不变,重定向会变。转发的地址必须是同一个应用内部某个地址,而重定向没有这个限制。转发是一件事情未做完,调用另外一个组件继续做;而重定向是一件事情已经做完,再做另外一件事情。