重定向和请求转发的区别

请求转发,例如:

request.getRequestDispatcher("/student_list.jsp").forward(request,response);//(一个请求,一个响应)

<jsp:forward page="apage.jsp" />
重定向,例如:

response.sendRedirect(request.getContextPath + "/student_list.jsp");//(两个请求,两个响应)

<%response.sendRedirect(request.getContextPath +"new.jsp");%>

转发过程客户发送http请求----》web服务器接受此请求,匹配Servlet并指定执行--》调用request的getRequestDispacther()方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户端。整个流程都是在服务端完成的,而且是在同一个请求里面完成的,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request,jsp能把结果getAttribute()出来,执行完把结果返回给客户端;它只能在同一个web应用中使用,可以共享request范围内的数据。整个过程是一个请求,一个响应转发过程在服务器端的跳转

重定向过程:客户发送http请求----》web服务器接受此请求,调用了responsesendRedirect()方法后,发送302状态码响应,对应新的location地址给客户浏览器--》客户浏览器收到这个请求后,发现是302响应,则自动再发送一个新location地址的请求--》服务器根据此请求寻找资源并发送给客户端。在重定向的过程中,可以重定向到任意URL,不能共享request范围内的数据,传输的信息会被丢失。整个过程是两个请求,两个响应。重定向是在客户端的跳转

重定向开发中适用情况:1.登录一定要用请求重定向,因为这样地址栏会发生变化,这样用户就可以从地址栏看出已转到首页了;
                            2.购物,购买商品后跳转到购物车(若是采用请求转发,因为共用同一个servlet,用户在购物车刷新会再买一个,造成重复购买);

总结:

       1、转发是在服务器端完成的,重定向是在客户端发生的;

       2、转发的速度快,重定向速度慢;

       3、转发是一个请求,一个响应,可防止服务器处理多次请求,减轻服务器的压力;重定向是两个请求,两个响应;

       4、转发地址栏没有变化,重定向地址栏有变化;

       5、转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成。

原文地址:https://www.cnblogs.com/huangdabing/p/9181101.html