重定向和转发分派的区别

来源:互联网 发布:妖师鲲鹏传txt下载知轩 编辑:程序博客网 时间:2024/05/19 16:37

之前经常混淆重定向和转发,趁着这一次有时间,好好的总结一下两者的区别。


重定向:sendRedirect

HttpServletResponse.sendRedirect(String location) 实现重定向。location指定了重定向的URL,可以使用绝对URL和相对URL,Servlet自动将绝对URL转化成绝对URL,再生成location字段。

sendRedirect()可以重定向到任何页面。包括当前程序中的其他资源,同一容器中的其他应用程序的资源,甚至使用绝对URL重定向到其他站点的资源。

重定向过程:浏览器发起一次sendRedirect()请求Request1,目的servlet收到请求后会发送302状态码 + 目的url(location)组成Response1发送给浏览器;浏览地收到302响应后会自动发送一个请求Request2到目的URL,然后目的servlet会发送Response到浏览器,浏览器和服务器总共完成两次请求和响应
重定向访问结束之后,浏览器的地址栏的URL会发生改变,由初始URL变为目的URL。
重定向之后要加上return语句,要不页面虽然跳转了但仍会执行跳转之后的语句,这不是我们期待的。




转发:forward

转发又叫请求分派,request.getRequestDispatcher(String url).forward(request, response)实现转发;路径可以使用相对路径也可以使用绝对路径。

转发过程:浏览器发起一次请求Request,服务器收到请求后,将请求在内部转发给目的URL指定的资源,然后新的资源发送Response给浏览器。浏览器和服务器只有一次请求和响应。
转发的路径必须是同一web容器中的URL,不能转发到别的web路径。
转发结束后浏览器的地址栏不会发生变化。



重定向和转发的区别:
1.转发只能将请求转发给同一web应用中的其他组件;重定向可以定向到任何资源。
2.转发结束后地址栏URL不会发生变化;重定向结束后地址栏由初始URL转变为目的URL。
3.转发访问服务器一次;重定向访问服务器两次。
4.转发是服务器行为;重定向是浏览器行为。
5.转发可以共享Request和Response;重定向不能共享。
6.转发执行跳转页面后,后面的代码不会执行;重定向跳转后面必须加上return语句,防止继续执行后面的语句。

总结
同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用RequestDispatcher.forward方法;
不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,应该使用HttpServletResponse.sendRedirect方法。


0 0