文章目录
- 为什么需要转发和重定向
- 服务器内部转发
- 客户端重定向
- 重定向的相关的状态码
- 对比
- 转发和重定向的应用场景
为什么需要转发和重定向
发一个请求给Servlet,接力棒就传递到了Servlet手中。而绝大部分情况下,Servlet不能独自完成一切,需要把接力棒继续传递下去,此时我们就需要请求的**『转发』或『重定向』**。
服务器内部转发
代码
request.getRequestDispatcher("/fruit/apple/red/sweet/big.html").forward(request, response);
- 关键:由于转发操作的核心部分是在服务器端完成的,所以浏览器感知不到,整个过程中浏览器只发送一次请求,地址栏没有变化,也只会收到服务器一次的响应信息
客户端重定向
本质:一种特殊的响应
完整定义:在请求的处理过程中,Servlet完成了自己的任务,然后以一个响应的方式告诉浏览器:“要完成这个任务还需要你另外再访问下一个资源”。
response.sendRedirect("....");
- 两次请求响应的过程。客户端肯定知道请求URL有变化
重定向的相关的状态码
永久重定向和临时重定向
- 永久重定向的意思就是我去让张三做手术,以后张三都不做,要做就去找李四,永久重定向的状态码是301,用的非常少
- 临时重定向的意思,这段时间张三不能做,先让李四做,以后再做手术就可以直接找张三做 302
- 临时重定向的进一步划分——前提是临时重定向
- 307说明是POST+POST
- 303是POST+GET
对比
转发 | 重定向 |
---|---|
一次请求 | 两次请求 |
浏览器地址栏显示的是第一个资源的地址 | 浏览器地址栏显示的是第二个资源的地址 |
全程使用的是同一个request对象 | 全程使用的是不同的request对象 |
在服务器端完成 | 在浏览器端完成 |
目标资源地址由服务器解析 | 目标资源地址由浏览器解析 |
目标资源可以在WEB-INF目录下 | 目标资源不能在WEB-INF目录下 |
目标资源仅限于本应用内部 | 目标资源可以是外部资源 |
转发和重定向的应用场景
可以简单的判断:能用转发的先用转发,如果转发不行,再使用重定向。
- 需要通过同一个request对象把数据携带到目标资源:只能用转发
- 如果希望前往下一个资源之后,浏览器刷新访问的是第二个资源:只能用重定向