目录
一、客户端跳转
客户端跳转也叫重定向(外部跳转),是调用HttpServletResponse对象中的sendRedirect()方法;
这是一个响应对象的方法,调用这个方法表明整个请求已经结束,服务器开始向客户端返回执行的结果;
//客户端跳转response
response.sendRedirect("target.jsp");
注意:
此跳转只能传递session和application范围的属性,而无法传递request范围的属性;
客户端会发送两个请求,并且页面的路径会改变。
重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
重定向过程:
(1)客户浏览器发送http请求
(2)web服务器接受后发送302状态码响应及对应新的location给客户浏览器
(3)客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址
(4)服务器根据此请求寻找资源并发送给客户。
在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
客户端跳转的过程:
二、服务端跳转
服务端跳转也叫请求转发(内部跳转),是RequestDispatcher接口的forward()方法来实现的;
而RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的。
//服务器跳转,调用RequestDispatcher接口
RequestDispatcher rd=request.getRequestDispatcher("target.jsp");
rd.forward(request, response);
注意:
服务器端跳转页面的路径不会发生改变,所以可以request范围的属性。
传输的信息不会丢失。
转发过程:
(1)客户浏览器发送http请求
(2)web服务器接受此请求
(3)调用内部的一个方法在容器内部完成请求处理和转发动作
(4)将目标资源发送给客户;
在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
服务端跳转的过程:
三、两者区别
一句话,转发是服务器行为,重定向是客户端行为。
(1)转发的速度快,重定向的速度慢;
(2)转发不会执行转发后的代码,重定向会执行重定向之后的代码
(3)转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成
通俗解释:
假如你去办理某项业务;
重定向: 你先去了A局,A局看了说:“这个业务不归我管,你要去B局。”,然后你就从A局退了出来,自己去了B局。
转发:你先去了A局,A局看了之后明白这个要B局弄,但是他并没有叫你走,而是让你等了一会儿,自己去办公室打电话叫B局的人弄好后送过来了,然后交给你。