重定向和请求转发

一、简单概述

  1. 重定向和请求转发 都是客户端向服务器发送了一个请求,但服务器端的原访问地址不能完全满足处理的请求,需要通过另外一个新地址继续处理请求。
  2. 重定向:客户端向服务器发送一个请求,请求地址栏发生了变化,服务器向客户端返回了一个继续处理的新地址,此时客户端自动访问服务器的新地址,服务器将新地址的内容返回给客户端。采用该重定向方式处理,客户端和服务器执行 两次请求和两次响应 ,且浏览器地址栏显示第二次访问的地址,即新地址。
  3. 请求转发:客户端向服务器发送一个请求,请求地址栏发生了变化,服务器调用 内部 的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。 采用该请求转发方式处理,客户端和服务器执行 一次请求和一次响应 ,且浏览器地址栏显示第一次访问的地址,即原地址。
  4. 区别:采用请求转发的方式处理页面的跳转,跳转的地址必须是本web应用系统的资源,不可以访问其它的资源,而重定向没有这个限制。

二、请求重定向与请求转发的详细比较
HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有很大的区别。

  1. RequestDispatcher.forward方法只能将请求转发给同一个Web应用中的组件,HttpServletResponse.sendRedirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到痛一个站点上的其他应用程序的资源,甚至是使用绝对URL重定向到其他站点的资源。对于sendRedirect如果传递的URL以”/”开头,他是相对于整个Web站点的根目录;对于forward如果传递的URL以”/”开头,它是相对于当前Web应用程序的根目录。
  2. sendRedirect对浏览器做出的响应是重新发出对另外一个URL的访问请求,forward在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果
  3. forward的调用者与被调用者之间共享相同的request对象和response对象,他们属于痛一个访问请求和响应过程;sendRedirect的调用者与被调用者使用各自的request和response对象,属于两个独立的访问请求和响应过程。

三、语句使用

请求转发语句

request.getRequestDispatcher("new.jsp").forward(request, response);//请求转发到new.jsp

重定向语句

response.sendRedirect("new.jsp");//重定向到new.jsp

在jsp页面中实现请求转发:

<jsp:forward page="apage.jsp"/>

在jsp页面中实现重定向:

<%response.sendRedirect("new.jsp");%>//重定向到new.jsp

四、简单总结

  1. 重定向:地址栏改变,可以访问不同服务器的资源,两次请求和两次响应。
  2. 请求转发:地址栏不变,只能访问同一台服务器的资源,一次请求和一次响应。
  3. 本质区别:转发是服务器行为,重定向是客户端行为。