- 转发:request.getRequstDispatcher(“xxx.jsp”).forward(request, response);
- 重定向:response.sendRedirect(“xxx.jsp”);
转发
- 客户端(浏览器)发送http请求
服务器(web容器/Tomcat)接受请求
调用内部方法在容器内部完成请求处理和转发动作
将目标资源发送给客户
Ps:
- 转发的路径必须是同一个web容器下的URL,不能转向到其他的web路径上去,中间传递的是自己容器内的request
- 客户端(浏览器)路径栏显示的仍然是第一次访问的路径,也就是说客户感觉不到服务器做了转发。
- 转发行为是浏览器只做了一次访问请求
- 传输的信息不会丢失
重定向
客户端(浏览器)发送http请求
web服务器接受后发送302状态码响应 以及 对应新的location给客户端
客户端接受到302状态码,自动再发送一个新的http请求,请求的URL是新的location地址
服务器根据请求寻找资源并发送给客户。
PS:
这里的location可以重定向到**任意**URL,既然是客户端(浏览器)重新发送出了请求,也就没有request传递的概念了
在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化
- 重定向行为浏览器至少做了两次访问请求
- 重定向过程中,传输的信息会被丢失
类比解释
假设你去办理某个执照,
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。