【转发、重定向和定时刷新】
什么是request和response?
在服务器接收浏览器的请求之后,在调用service方法处理请求之前,服务器会创建Request和Response对象,分别用来封装请求和响应信息。
request:代表http请求信息的对象,表示用户发向服务器的请求,封装了浏览器发送过来的请求信息
response:代表http响应信息的对象,表示对用户请求的一个响应,封装了将要发送给浏览器的响应信息

请求转发—— 将请求从一个资源转交给另外一个资源的过程
转发使用的方法:request.getRequestDispatcher().forward();
转发的过程:
客户端浏览器发送http请求——>web浏览器接受请求——>调用内部的一个方法在容器内部完成请求处理和转发工作
转发的特点:
- 转发是服务端的行为(比如servlet);
- 效率比重定向高,因为转发是一次请求一次响应,并且只需要给出转发的资源路径即可;
- 转发的地址栏不会发生改变,只是浏览器做了一次访问请求;
- 转发只能转发本项目的其他资源;
- 在转发过程中,会携带request过去,可以将数据保存到request域对象中去,请求域中的数据不会丢失;
- 转发可以简单的将属性添加到Model,使得目标视图可以轻松访问
域对象:如果一个对象具备可以被访问的范围,利用该对象上的map集合,可以在整个范围内实现资源的共享
重定向——被动称为301重定向,是一种资源的跳转方式,和请求转发相比,重定向可以不是同一个web 应用的两个资源
重定向使用的方法:response.sendRedirect();
重定向的过程:
客户端浏览器发送http请求——>web服务器接收后,发送302状态码响应,并发送location给客户端服务器(location代表重定向的地址)——>客服端服务器发现是302状态码响应后自动发送一个http请求,请求url为重定向的地址——>服务器根据请求寻找资源后转发给客户端,在客户浏览器中显示重定向的路径,客户可以看到地址改变了。(重定向对浏览器至少做了两次请求,是可以进行多次跳转的)
重定向的特点:
- 重定向是客户端的行为;
- 效率没有转发高,因为重定向是两次请求两次响应,并且需要给出全路径(要包含项目名);
- 重定向的地址发生了改变,地址栏会显示第二次请求的地址;
- 重定向不仅可以重定向到本项目的其他资源,还可以重定向到其他项目的资源;
- 在重定向的过程中不会携带request过去,请求域中的数据会丢失;
- 性能没有转发好,无法将值轻松的传递给目标页面,因为重定向经过客服端时Model中的一切都会在重定向时丢失
转发和重定向的区别?
- 转发是服务端的行为,重定向是客户端的行为;
- 效率比重定向高;
- 因为转发是一次请求一次响应,并且只需要给出转发的资源路径即可;而重定向是两次请求两次响应,并且需要给出全路径(要包含项目名);
- 转发的地址栏不会发生改变,只是浏览器做了一次访问请求;重定向的地址发生了改变,地址栏会显示第二次请求的地址;
- 转发只能转发本项目的其他资源;重定向不仅可以重定向到本项目的其他资源,还可以重定向到其他项目的资源;
- 在转发过程中,会携带request过去,可以将数据保存到request域对象中去,请求域中的数据不会丢失;在重定向的过程中不会携带request过去,请求域中的数据会丢失;
- 转发可以简单的将属性添加到Model,使得目标视图可以轻松访问;性能没有转发好,无法将值轻松的传递给目标页面,因为重定向经过客服端时Model中的一切都会在重定向时丢失。
什么时候使用转发?什么时候使用重定向?
- 如果希望跳转前后地址栏地址不会发生变化,则使用转发;例如,在注册或登录成功后,浏览器地址栏地址将会跳转到首页。
- 如果希望在跳转的同时能带数据到目的地,则使用转发;
- 如果只是做一个跳转,没有什么其他需求,则推荐使用转发(因为转发是一次请求);
- 如果希望跳转前后地址栏地址会发生变化,则使用重定向;例如:避免用户重复提交数据,用户在提交表单后会重定向到一个不同的页面
- 访问数据库时,增删改使用重定向,查询使用转发;
- 一般情况下应该使用转发,减少浏览器对服务器的访问,减轻服务器压力
定时刷新——和重定向相似,定时刷新可以指定在多少秒之后再跳转
定时刷新:response.setHeader("Refresh", "3;url=/index.html");
- 定时刷新和重定向不同的是, 重定向是立即跳转, 中间没有时间间隔, 而定时刷新可以指定多少秒之后再进行跳转, 在跳转之前, 可以输出内容到浏览器, 提示用户;
- 定时刷新和重定向都是两次请求, 两次响应;
- 定时刷新和重定向跳转前后, 地址栏地址都会发生变化;
- 定时刷新和重定向在跳转时没有限制, 既可以在同一个Web应用内部的资源之间进行跳转, 也可以在不同的Web应用或者不同的主机之间进行跳转。