请求转发与重定向的区别及使用场景选择
一、请求转发:
服务器行为: 因为它是代码与代码之间的资源跳转
特点:
- 转发的所有Servlet都是同一个请求,使用同一个request和response!
- 由最后一个Servlet完成响应体! 当前Servlet可以设置响应头!(留头不留体)
- 因为它是同一个request,以前request中存放的变量不会失效,就像把两个页面拼到了一起
二、重定向:
客户端行为: 因为它是客户端与客户端之间的资源跳转
特点:
- 重定向可以访问自己web应用以外的资源(如:www.baidu.com)。
- 每次的重定向都是新的请求(request),以前的request中存放的变量全部失效,并进入一个新的request作用域。
三、请求转发过程:
- JSP容器将使用一个内部的方法来调用目标页面。
- 新的页面继续处理同一个请求。
- 而浏览器将不会知道这个过程。
四、重写向过程:
- 第一个页面通知浏览器发送一个新的页面请求。
- 由于重定向方式产生了一个新的请求。
- 经过一次重定向后,request内的对象将无法使用。
五、重要区别:
- 请求转发是一个请求一次响应,而重定向是多次请求多次响应。
- 请求转发地址栏不变化,而重定向会显示请求的地址。
- 请求转发只能转发当前web应用,而重定向还可以访问自己web应用以外的资源。
- 请求转发效率高,因为是一个请求。
六、场景选择:
- 一个请求跨多个Servlet,用请求转发。
- 因为转发只能访问当前web的应用程序,所以需要访问到另外一个web站点上的资源的情况,这个时候就只能使用重定向。
- 请求转发比重定向速度快,因为是同一个请求,所以如果在使用转发和重定向都无所谓的时候建议使用转发。