请求转发与重定向区别
学习spring时又想到了javaweb的小知识
我觉得这个问题我们有必要来搞清楚一下。其实理清关系也不是很难。
转发request:
request.getRequestDispatcher(path).forward(request, response);
用户在浏览器发送请求,然后到Servlet1,Servlet1可能没有达到目标,内部再转到Servlet2,Servlet2处理,处理完之后将结果返回给浏览器。对服务器而言,用户访问两个Servlet,但对于用户而言,则请求一次,响应一次,这个过程叫转发,用户以为请求了一个资源,而服务器内部又请求了一个资源,url不变。
因为只发一次请求,所以request中的数据是可以共享的。
重定向:
response.sendRedirect(path);
浏览器发送请求,到Servlet1,Servlet1把结果显示给浏览器,Servlet1告诉浏览器,你访问的资源还是不够,你可以再去访问另外一个资源,Servlet1有一个302告诉浏览器Servlet2地址,浏览器再发一个请求到Servlet2,Servlet2处理完结果再返回给浏览器。浏览器发送两次请求,得到两次响应,url肯定会有变化
浏览器每次发送请求到服务器,都会执行Servlet中服务的方法,服务方法执行之前,都会创建一个用于接受请求的request,和用于响应数据的response,浏览器发送两次请求到服务器,会创建两个新的request,意味着两个request中的数据不能共享。
区别总结:
1.重定向是浏览器发送请求并受到响应以后再次向一个新地址发请求;转发服务器收到请求后为了完成响应转到另一个资源。
2.重定向中有两次请求对象,不共享数据;转发只产生一次请求对象且在组件间共享数据。
3.重定向后地址栏地址改变;而转发则不会。
4.重定向的新地址可以是任意地址;转发必须是同一个应用内的某个资源。
5.转发是服务端行为,重定向是客户端行为