请求转发和重定向

400 阅读2分钟

发一个请求给Servlet,接力棒就传递到了Servlet手中。而绝大部分情况下,Servlet不能独自完成一切,需要把接力棒继续传递下去,此时我们就需要请求的转发重定向

一.转发

请求转发可以理解为是服务器端的行为,客户端发起一次请求,这个请求在整个服务器端可以被多次传递,但都是由服务器端的处理程序传递给另一个处理程序,客户端不需要发起第二次请求,无论这个请求经历多少个处理程序,始终都是同一请求,也就意味着,这个请求中的数据经历过的每一个处理程序都可以使用。而客户端路径栏显示的还是第一次访问的路径。

Snipaste_2022-03-06_09-57-22.png

request.getRequestDispatcher("/fruit/apple/red/sweet/big.html").forward(request, response);
代码类比实际
request飞机
getRequestDispatcher("转发地址")告诉机长目的地
forward(request, response)芜湖起飞

二.重定向

重定向可以理解为是客户端行为,客户端发起一次请求,服务器端给出一次响应,但这个响应包含下一次客户端需要访问的服务器端处理程序的地址,客户端再次发起请求,将会得到处理结果,也就意味着重定向客户端至少发起两次请求。并且当使用了重定向跳转页面后,客户端路径栏显示的是其重定向的路径。

Snipaste_2022-03-06_10-08-04.png

response.sendRedirect("/app/fruit/apple/red/sweet/big.html");

三.对比

转发重定向
一次请求两次请求
浏览器地址栏显示的是第一个资源的地址浏览器地址栏显示的是第二个资源的地址
全程使用的是同一个request对象全程使用的是不同的request对象
在服务器端完成在浏览器端完成
目标资源地址由服务器解析目标资源地址由浏览器解析
目标资源可以在WEB-INF目录下目标资源不能在WEB-INF目录下
目标资源仅限于本应用内部目标资源可以是外部资源

四.转发和重定向的应用场景

  • 需要通过同一个request对象把数据携带到目标资源:只能用转发
  • 如果希望前往下一个资源之后,浏览器刷新访问的是第二个资源:只能用重定向