转发和重定向流程详解
摘要: 摘自《深入体验JAVA WEB开发内幕——核心基础》,如有版权问题,请联系我。
一、用sendRedirect方法实现请求重定向
sendRedirect方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL。
RedirectServlet.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RedirectServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
// 1、写入到输出缓冲区中的内容还没有被真正传送到客户端,sendRedirect方法就可以被正确执行
// 并且将输出缓冲区中原来或调用方法后写入的内容都清空,所以下面两条打印语句都不会显示
out.println("before sendRedirect");
response.sendRedirect(request.getContextPath() + "/test.html");
// 与上面语句效果一样
//response.sendRedirect("../test.html");
// 相对URL以“/”开头,则相对于Tomcat的虚拟根目录,而不是相对于当前Web应用程序的根目录(虚拟目录)
// 访问报404,URL是localhost:8888/test.html
//response.sendRedirect("/test.html");
out.println("after sendRedirect");
}
}
在浏览器输入http://localhost:8888/testSendRedirect/servlet/RedirectServlet地址,页面显示为:
注意,此时的URL是test.hmtl本身的路径,而不是RedirectServlet的路径
二、请求重定向和请求充转发两者的区别
1、请求转发的运行流程
Web浏览器——————发出HTTP请求(到)——————Web容器;
Web浏览器 Web容器————首次访问,容器创建目标servlet————servlet(servlet1)
web容器创建请求对象和响应对象
web容器调用servlet1的service方法并将请求对象和响应对象传递给该方法
servlet1对象的service方法从请求对象中读取请求信息,这时也可以在响应对象中写入部分响应头和响应体数据
service方法向web容器发出forward命令表示要跳转到servlet2,web容器清空当前所写入的响应体内容,并调整请求头中的信息
web容器根据forward命令调用servlet2对象,如果初次访问则加载创建servlet2对象
web容器调用servlet2的service方法,并将请求对象和响应对象传递给该方法。注意,这里传递的还是调用servlet1时所创建的request和response对象
servlet2对象的service方法从请求对象中读取请求信息,并向响应对象中写入响应头和响应体信息
servlet2的service方法执行完毕后返回
servlet1的service方法继续执行调用forward方法的语句后面的代码,执行完毕后返回
web容器从响应对象中读取响应信息
web容器将响应信息发送给浏览器处理和显示,一次请求响应过程完全结束,request和response变成垃圾,等待垃圾回收器回收
2、请求重定向的运行流程
Web浏览器——————发出HTTP请求(到)——————Web容器;
Web浏览器 Web容器————首次访问,容器创建目标servlet————servlet(servlet1)
web容器创建请求对象和响应对象
web容器调用servlet1的service方法并将请求对象和响应对象传递给该方法
servlet1对象的service方法从请求对象中读取请求信息,并将包含重定向的响应头信息写入到响应对象中。
service方法执行完毕后返回
web容器从响应对象中读取响应信息
web容器把包含重定向的响应信息发送给浏览器。一次请求响应过程完全结束,request和response变成垃圾,等待垃圾回收器将其彻底从内存中清除。
web浏览器根据上次返回的重定向URL发出新的HTTP请求,这个请求甚至可以指向另外一个站点,web浏览器又开始一次全新的请求响应过程。
如果请求资源为servlet并首次访问,web容器则加载和创建该servlet对象。
web容器创建请求对象和响应对象
web容器调用servlet2的service方法并将请求对象和响应对象传递给该方法
servlet2对象的service方法从请求对象中读取请求信息,并向响应消息对象中写入响应头和响应体消息
service方法执行完毕后返回
web容器从响应对象中读取响应信息
web容器将响应信息发送给浏览器处理和显示,新的请求响应过程完全结束,request和response变成垃圾,等待垃圾回收器回收
3、比较
forward方法只能将请求转发给同一个web应用中的组件;而sendRedirect方法不仅可以重定向到当前应用程序中的其他资源,还可以是同一个站点上的其他资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递给sendRedirect方法的相对URL以“/”开头,它是相对于整个web站点的根目录(如果不指定则是以当前页面为相对路径);创建RequestDispatcher对象时指定的相对UR必须以“/”开头(不这样则报错),它是相对于当前web应用程序的根目录。
调用sendRedirect方法重定向的访问过程结束后,浏览器由初始的URL变为重定向目标的URL;而调用forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL。
sendRedirect方法对浏览器的请求直接做出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求。forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
无论forward方法还是sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓存区中已经有了一些内容,这些内容将被清除掉。
© 著作权归作者所有
转发和重定向流程详解相关推荐
- java web请求转发_Javaweb请求转发及重定向实现详解
请求转发:在同一个controller将请求转发到另一个请求映射,请求地址不会发生改变 //请求转发 @RequestMapping("/testFoeward") //@Resp ...
- 负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解
负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解 系列文章: 负载均衡详解第一篇:负载均衡的需求 负载均衡详解第二篇:服务器负载均衡的基本概念-网络基础 负载均衡详解第三篇:服务器负载均衡的基 ...
- 【联机对战】微信小程序联机游戏开发流程详解
现有一个微信小程序叫中国象棋项目,棋盘类的单机游戏看着有缺少了什么,现在给补上了,加个联机对战的功能,增加了可玩性,对新手来说,实现联机游戏还是有难度的,那要怎么实现的呢,接下来给大家讲一下. 考虑到 ...
- UE发起的PDU Session Establishment流程详解(1)
相关文章会在公众号同步更新.公众号:5G通信大家学 持续更新的相关5G内容都是直接根据3GPP整理,保证更新内容的准确性,避免通过二手,甚至多手的资料,以讹传讹误导网友. 在介绍完流程详解后,会整理专 ...
- 浏览器的渲染流程详解
文章目录 浏览器的渲染流程详解 一:主线程 1:解析html 2:样式计算 (computed style) 3:布局 4:分层 5:绘制 二:合成线程 6:分块 7:光栅化 8:画 浏览器的渲染流程 ...
- ant design pro vue 动态路由 流程详解
ant design pro vue 动态路由 流程详解 前言 流程图 流程1 src/permission.js 流程2 src/store/modules/user.js 流程3 src/perm ...
- 跨境电商三单对碰三单申报流程详解
跨境电商三单对碰三单申报流程详解 概要:三单申报是指"电子订单.电子运单.支付凭证". 1.电子订单: 适合申报企业类型"电商企业.电商交易平台.电商境内代理企业&quo ...
- Android事件流程详解
Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...
- 基于spark mllib_Spark高级分析指南 | 机器学习和分析流程详解(下)
- 点击上方"中国统计网"订阅我吧!- 我们在Spark高级分析指南 | 机器学习和分析流程详解(上)快速介绍了一下不同的高级分析应用和用力,从推荐到回归.但这只是实际高级分析过程 ...
最新文章
- Nature:科学家成功解读大脑构建的分子机制
- android 实现SSL握手协商
- 小程序类似抖音视频整屏切换
- Python基础(七)--模块和包
- Python入门(01) -- 列表简介
- 在变薄变厚的周而复始中前进的信息
- tp3.2 模型page和limit方法区别
- 最优化问题中,牛顿法为什么比梯度下降法求解需要的迭代次数更少?
- hrbust 哈理工oj 1921 三原色(改进版)【集合相关问题】
- jQuery遮罩插件 jquery.blockUI.js
- Producter:让产品从0到1
- 如何干净的卸载Mac版VMware Fusion
- Wilcoxon符合秩和检验
- mpc安装教程linux,linux mpc 安装
- 基于ESP32与phyphox的DIS实验制作(4)-使用超声波位移传感器研究弹簧振子的运动
- 开关造成的毛刺_令人困扰的DAC输出毛刺消灭记
- 【Scratch】青少年蓝桥杯_每日一题_6.25_加密
- C语言中fopen函数使用举例及打开方式列表
- 华为鸿蒙os2.0系统是什么,6月2日,华为鸿蒙2.0手机系统正式登场!苹果有什么动作?...
- C++ 之学习大纲网址:文档:C++ knowledge.note 链接:http://note.youdao.com/noteshare?id=c786848810ceb817ae61b76c6bf