重定向&转发
转发&重定向
重定向:向客户端发送一个指定URL的临时重定向的响应。
转发:将一个请求转到服务器的另一个资源。在处理完初步请求另外的资源之后生成响应。
定义基本说明转发操作为何可以保持request内的parameter,attribute这些值都可以保留,而重定向操作却会丢弃的原因:
- 转发是在服务端完成的,并没有经过客户端
- 转发整个操作完成后才生成响应
- 重定向是服务端向客户端发送指定的URL
- 重定向是在客户端完成的
容器实现:
在servlet内部一般对于这两者的使用形式也相当直观,例如对于hello.jsp的请求:
sendRedirct方法:
response.sendRedirect("/hello.jsp");
是服务端根据逻辑,发送一个状态码(302重定向),告诉浏览器重新去请求那个地址。地址栏显示的是新的URL。
forward方法:
request.getRequestDispatcher("/hello.jsp").forward(request, response);
在转发中浏览器发请求的时候是一个固定的URL,整个重定向是服务端内部进行的,浏览器并没有感知到,因此也不会显示出来。
区别
-
地址栏
-
forward:服务器行为。
服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器不知道服务器发送的内容从哪里来的,跳转过程是在服务器实现的,客户端不知道这个跳转动作,地址栏不变
-
redirect:客户端行为。
服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,地址栏显示的是新的URL
-
-
数据共享
- forward:转发页面和转发到的页面可以共享request里面的数据
- redirect:不能共享数据
-
使用场景
- forward:一般用于用户登陆的时候,根据角色转发到相应的模块
- redirect:一般用于用户注销登陆时,返回主页面和跳转到其它的网站等
-
效率
- forward:高
- redirect:低
-
重定向会显示真实路径,转发不会;
-
重定向之后,原来的request中的数据都丢掉,而转发却还是能保证request中的数据依然保留;
两个动作的工作流程:
转发:
-
客户浏览器发送http请求
-
web服务器接受此请求
-
调用内部的一个方法在容器内部完成请求处理和转发动作
-
将目标资源发送给客户
在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。
转发行为是浏览器只做了一次访问请求
重定向:
- 客户浏览器发送http请求
- web服务器接受后发送302状态码响应及对应新的location给客户浏览器
- 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址
- 服务器根据此请求寻找资源并发送给客户
在这里 location 可以重定向到任意URL,既然是浏览器重新发出请求,则就没有什么request传递的概念。在客户浏览器路径栏显示的是其重定向的路径, 客户可以观察到地址的变化的。
重定向行为是浏览器至少两次的访问请求的
重定向,其实是两次request。第一次,客户端request A,服务器响应, 并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。