Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。
用户向服务器发送了一次HTTP请求,这个请求可能被直接请求转发(Forward)和间接请求转发(Redirect),两种转发方式有何区别呢?
直接转发就相当于:“A找B借钱,B没有,B去找C借,并告诉C把钱给A”
间接转发就相当于:"A找B借钱,B没有,告诉A去找C借"
直接转发方式(Forward)
客户浏览器发送http请求--->web服务器接受此请求--->调用内部的一个方法在容器内部完成请求处理和转发动作--->将目标资源 发送给客户
- 转发目标必须是同一个web容器下的url
- 客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的jsp或者servlet中使用。即保存的对象对于每个信息资源是共享的。
- 在客户浏览器路径栏显示的仍然是其第一次访问的路径
- 转发行为是浏览器只做了一次访问请求。
- 一般用于用户登录的时候,根据角色转发到相应的模块
request.getRequestDispatcher("login.jsp").forward(request, response);
//转发到login.jsp
间接转发方式(Redirect)
客户浏览器发送http请求--->web服务器接受后发送302状态码响应及对应新的location给客户浏览器--->客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址--->服务器根据此请求寻找资源并发送给客户
- 是客户端的重定向,是完全的跳转。即服务器返回的一个url给客户端浏览器,然后客户端浏览器会重新发送一次请求,到新的url里面,因此浏览器中显示的url网址会发生变化
- 因为这种方式比forward多了一次网络请求,因此效率会低于forward
- 在重定向的过程中,传输的信息会被丢失。
- 一般用于用户注销登录时返回主页面或者跳转到其他网站
response.sendRedirect("login.jsp");
//重定向到login.jsp
文中的例子和图片摘自如下博主: