在Web开发中,重定向和转发是我们进行页面跳转所使用的两种方式,那么它们之间有什么区别呢?
我们先看看他们的写法
//重定向
response.sendRedirect("URL");
//转发
request.getRequestDispatcher("URL").forward(request, response);
重定向的执行过程:
客户端向服务器端发送一个请求----->web服务器向浏览器发送一个响应----->浏览器根据此响应再发送一个新的请求到服务器------->服务器根据此请求寻找资源并发送给浏览器。它可以重定向到任意的URL,不能共享request范围内的数据。
转发的执行过程:
客户端发送请求到服务器端-------->Web服务器调用内部的方法在容器内部完成请求处理和转发动作------->将目标资源发送给客户端。它只能在同一个Web应用中使用,可以共享request范围内的数据。
总结区别
重定向
- 地址栏上显示的是最后的那个资源的路径地址
- 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。
- 可以跳转到任意路径。 不是自己的工程也可以跳。(可以跨程序访问资源)
- 效率稍微低一点, 执行两次请求。
- 后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。
- 是客户端行为
转发
- 地址上显示是原来的地址。 会返回200 ok
- 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。
- 只能跳转自己项目的资源路径 。 (不可以跨程序访问资源)
- 效率上稍微高一点,因为只执行一次请求。
- 可以使用上一次的request对象。
- 是服务端行为
最后在举一个较为生动的例子
重定向:
小宇去A部门盖章,A部门并不能解决这件事情,A部门告诉小宇:“我们并不能解决这件事情,但B部门可以,你去找它吧,B部门在XXXXXXXXXX。”然后小宇就去找B部门,B部门也解决了小宇的事情。 在这个过程中,小宇问了(请求)两次,得到了两次的答复(响应)。
转发
小宇去A部门盖章,A部门并不能解决这件事情,但是B部门可以,于是A部门就帮小宇把文件拿到B部门那里盖好章,在拿回来给小宇。在这个过程中,小宇一次请求得到了一次响应。