这两者的区别是经典面试问题,我们在servlet或JSP编程中也经常用到,接下来看下他们的接口定义所属类。
- sendRedirect(String url),定义在HttpServletResponse)
该方法用于将客户端请求重定向到其他位置进一步处理,新位置可以在其他服务器或不同上下文,并且该请求是在结束本次请求后,由浏览器重新发起的一次请求,因此也称为客户端重定向。
这样说可能更直白,调用该方法后如何告知浏览器进行重定向呢?在本次请求的response中头部写入location,看到此明白了吧 -
forward(ServletRequest request, ServletResponse response),定义在RequestDispatcher中
该方法用于在同一服务器中跳转,处于同一个上下文环境中,另一个资源可以是jsp、servlet或其他的文件,是脱离前端干预的,仍处于本次请求过程中,因此也叫做服务器端重定向。
详细区别在此处
forward()
|
SendRediret()
|
当我们使用转发方法时,请求将传输到同一服务器内的其他资源以进行进一步处理。
|
在sendRedirect的情况下,请求将传输到另一个资源到另一个域或另一个服务器以进行进一步处理。
|
如果使用正向Web容器,则内部处理所有进程,并且不涉及客户端或浏览器。
|
当您使用SendRedirect容器时,会将请求传输到客户端或浏览器,因此sendRedirect方法内给出的url 作为对客户端的新请求可见。
|
当在requestdispather对象上调用forward时,我们传递请求和响应对象,因此我们的旧请求对象存在于将处理我们请求的新资源上
|
如果使用SendRedirect调用,则旧的请求和响应对象将丢失,因为浏览器将其视为新请求。
|
视觉上我们看不到转发的地址,它是透明的
|
在地址栏中,我们可以看到新的重定向地址,它不是透明的。
|
使用forward()方法比发送重定向要快。
|
SendRedirect较慢,因为需要一个额外的往返行程,因为完全创建了新请求,并且丢失了旧的请求对象。需要两个浏览器请求。
|
当我们使用正向重定向并且希望在新资源中使用相同的数据时,可以使用request.setAttribute(),因为我们有可用的请求对象。
|
但是在sendRedirect中,如果要使用它,则必须将数据存储在会话中或与URL一起传递。
|
附录: