HTTP 请求处理的完整流程到Servlet流程图

HTTP 请求处理的完整流程。从 TCP 三次握手开始,一直到 Servlet 处理请求并返回响应。

首先,让我解释一下 response.setContentType("text/html;charset=UTF-8"); 这行代码:

这行代码设置了 HTTP 响应的 Content-Type 头。它告诉浏览器:

  1. 响应的内容类型是 HTML (text/html)
  2. 字符编码是 UTF-8 (charset=UTF-8)

这样浏览器就知道如何正确地解析和显示返回的内容。

现在,让我们创建一个详细的流程图,展示从客户端发起请求到服务器处理并返回响应的整个过程。

客户端 (浏览器) 服务器 Web容器 (如Tomcat) Servlet 1. TCP SYN 2. TCP SYN-ACK 3. TCP ACK TCP三次握手完成 4. 发送HTTP请求 5. 接收HTTP请求 6. 解析请求URI 7. 创建ServletRequest和ServletResponse 8. 调用Servlet的service()方法 9. 根据HTTP方法调用doGet()/doPost() 10. 设置响应内容类型 (response.setContentType()) 11. 处理请求逻辑 12. 生成响应内容 13. 返回处理结果 14. 生成HTTP响应 15. 发送HTTP响应 16. 解析和显示响应内容 17. TCP FIN 18. TCP ACK 19. TCP FIN 20. TCP ACK TCP四次挥手完成 客户端 (浏览器) 服务器 Web容器 (如Tomcat) Servlet

让我为您详细解释这个流程:

  1. TCP 三次握手(步骤 1-3):

    • 客户端发送 SYN 包到服务器
    • 服务器回复 SYN-ACK 包
    • 客户端发送 ACK 包
      这个过程建立了 TCP 连接。
  2. HTTP 请求发送(步骤 4):
    客户端(浏览器)通过建立的 TCP 连接发送 HTTP 请求。

  3. 服务器处理(步骤 5-6):
    服务器接收请求并将其传递给 Web 容器(如 Tomcat)。Web 容器解析请求的 URI。

  4. Servlet 处理准备(步骤 7-8):
    Web 容器创建 ServletRequest 和 ServletResponse 对象,然后调用匹配的 Servlet 的 service() 方法。

  5. Servlet 处理请求(步骤 9-12):

    • Servlet 根据 HTTP 方法(GET/POST 等)调用相应的方法(如 doGet())
    • 设置响应内容类型(就是您问到的那行代码)
    • 处理请求逻辑(如获取参数、访问数据库等)
    • 生成响应内容
  6. 响应返回(步骤 13-15):
    Servlet 将处理结果返回给 Web 容器,Web 容器生成 HTTP 响应,服务器将响应发送回客户端。

  7. 客户端处理(步骤 16):
    浏览器接收响应,解析内容(根据之前设置的 Content-Type),并显示给用户。

  8. TCP 四次挥手(步骤 17-20):

    • 客户端发送 FIN 包
    • 服务器回复 ACK 包
    • 服务器发送 FIN 包
    • 客户端回复 ACK 包
      这个过程关闭 TCP 连接。

在这个过程中,response.setContentType("text/html;charset=UTF-8"); 发生在步骤 10。它是 Servlet 处理过程的一部分,用于告诉客户端(浏览器)如何解释返回的数据。

这个流程图展示了从网络连接建立到 Servlet 处理再到连接关闭的整个过程。理解这个流程对于深入学习 Web 开发非常有帮助。

当涉及到文件下载时,setContentType() 方法变得尤为重要,因为它告诉浏览器如何处理你要发送的文件。让我给您举几个例子:

  1. PDF文件下载:

    response.setContentType("application/pdf");
    

    这告诉浏览器:“嘿,我要发送给你的是一个PDF文件。”

  2. Excel文件下载:

    response.setContentType("application/vnd.ms-excel");
    

    这表示:“这是一个Excel文件,请用相应的程序打开它。”

  3. 普通文本文件下载:

    response.setContentType("text/plain");
    

    这意味着:“这是一个纯文本文件。”

  4. ZIP文件下载:

    response.setContentType("application/zip");
    

    这告诉浏览器:“这是一个ZIP压缩文件。”

在文件下载的场景中,除了设置 Content-Type,你通常还需要设置一些其他的响应头,比如:

String filename = "example.pdf";
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

这里的 Content-Disposition 头告诉浏览器这是一个需要下载的文件,而不是直接在浏览器中显示。filename 参数指定了下载时的文件名。

实际的文件下载代码可能看起来像这样:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 假设我们要下载一个名为 "report.pdf" 的文件String filename = "report.pdf";String filepath = "/path/to/your/file/" + filename;File file = new File(filepath);response.setContentType("application/pdf");response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");response.setContentLength((int) file.length());FileInputStream fileInputStream = new FileInputStream(file);OutputStream responseOutputStream = response.getOutputStream();int bytes;while ((bytes = fileInputStream.read()) != -1) {responseOutputStream.write(bytes);}fileInputStream.close();responseOutputStream.close();
}

这段代码做了以下几件事:

  1. 设置 Content-Type 为 PDF。
  2. 设置 Content-Disposition 头,告诉浏览器这是一个需要下载的文件。
  3. 设置 Content-Length,让浏览器知道文件的大小。
  4. 读取文件内容并写入响应输出流。

通过正确设置这些头部,你可以确保当用户点击下载链接时,文件会以正确的方式被下载,而不是在浏览器中直接打开或显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工具箱】NAND NOR FLASH闪存

随着国内集成电路的发展,特别是存储芯片方面,关于NOR Flash,NAND Flash,SD NAND, eMMC, Raw NAND的资料越来越多了。这里我专门写了这篇文章:1,把常用的存储产品做了分类; 2,把这些产品的特点做…

[Postman]接口自动化测试入门

文章大多用作个人学习分享,如果大家觉得有不足或错漏的地方欢迎评论指出或补充 此文章将完整的走一遍一个web页面的接口测试流程 大致路径为: 创建集合->调用接口登录获取token->保存token->带着token去完成其他接口的自动化测试->断言-&g…

Kafka下载与安装教程(国产化生产环境无联网服务器部署实操)

请放心观看,已在正式环境部署验证,流程无问题! 所用系统为国产化麒麟银河 aarch64系统,部署时间2024年9月份! [rootecs-xxxxxx-xxx ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION&q…

MySQL 查询数据库的数据总量

需求:查看MySQL数据库的数据总量,以MB为单位展示数据库占用的磁盘空间 实践: 登录到MySQL数据库服务器。 选择你想要查看数据总量的数据库: USE shield;运行查询以获取数据库的总大小: SELECT table_schema AS Datab…

go语言后端开发学习(七)——如何在gin框架中集成限流中间件

一.什么是限流 限流又称为流量控制(流控),通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景,比如:某景区限制每日进入景区的游客数量为8万人;沙河地铁站早高峰通过站外排队逐一放行的…

Go 中 Gin 框架的使用指南

Gin 是 Go 语言中一个非常流行的 Web 框架,因其性能优异、简单易用的 API 设计而受到开发者的喜爱。Gin 的优势在于其高效的路由处理和中间件机制,适用于构建 RESTful API 和其他 Web 应用。本文将介绍如何使用 Gin 框架开发一个简单的 Web 应用&#xf…

JAVA毕业设计170—基于Java+Springboot+vue3+小程序的房屋租赁小程序系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3小程序的房屋租赁小程序系统(源代码数据库)170 一、系统介绍 本项目前后端分离(可以改为ssm版本),分为用户、房东、管理员三种角色 1、用户&am…

[000-002-01].第03节:Linux系统下Oracle的安装与使用

2.1.Docker安装Oracle 在CentOS7中使用Docker安装Oracle: 1.安装Docker,详细请参考:https://blog.csdn.net/weixin_43783284/article/details/1211403682.拉取镜像: docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g3.下载…

删除有序数组中的重复项(同向指针(快慢指针))

题目: 算法分析: 快慢指针从0出发若快慢指针不相同,快指针替换慢指针(即慢指针后一位)快指针每次都会增加题目求不重复的元素个数(slow 为对应元素索引,故个数为slow1) 算法图解…

如何通过编程工具提升工作效率

目录 常用编程工具介绍 工具效率对比 未来发展趋势 结论 在当今软件开发的高效环境中,工具的选择至关重要。无论是编写代码、调试,还是协作开发,合适的编程工具不仅能够简化开发流程,还可以有效地提高生产力。开发者在日常工作…

声波的波数,通常用k表示

声波的波数(通常用 k 表示)是描述声波空间变化的一个参数,它与声波的频率和介质中的传播速度有关。波数 k 是一个具体值,并且在均匀介质中它是固定的,计算公式如下: 均匀介质中的波数是一个具体值&#xff…

ESP8266+httpServer+GET+POST实现网页验证密码

1. 代码 #include "esp_http_server.h" #include "esp_log.h" #include "web_server.h"// 辅助宏&#xff0c;用于计算两个数中的较小值 #define MIN(a, b) ((a) < (b) ? (a) : (b))static const char *TAG "wifi web_server";c…

自己看---分披萨

题目描述 "吃货"和"馋嘴"两人到披萨店点了一份铁盘&#xff08;圆形&#xff09;披萨&#xff0c;并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块&#xff0c;且肉眼能分辨出大小。 由于两人都…

安卓BLE蓝牙通讯

蓝牙测试demo 简介   Android手机间通过蓝牙方式进行通信&#xff0c;有两种常见的方式&#xff0c;一种是socket方式&#xff08;传统蓝牙&#xff09;&#xff0c;另一种是通过GATT&#xff08;BLE蓝牙&#xff09;。与传统蓝牙相比&#xff0c;BLE 旨在大幅降低功耗。这样…

华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

气压测试实验(用IIC)

I2C: 如果没有I2c这类总线&#xff0c;连接方法可能会如下图&#xff1a; 单片机所有的通讯协议&#xff0c;无非是建立在引脚&#xff08;高低电平的变换高低电平持续的时间&#xff09;这二者的组合上&#xff0c;i2c 多了一个clock线&#xff0c;负责为数据传输打节拍。 (i2…

C#使用TCP-S7协议读写西门子PLC(四)

接上一篇,我们连接PLC并握手成功,并且封装生成读写PLC的命令 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 这里我们进行读写基础数据类型、读取DB块的字符串、宽字符串、以及一系列连续数组。 新建部分类文件SiemensS7ProtocolUtil.Integrated.cs 主要方法 读取任意连续…

C和指针:函数

函数定义 函数体就是一个代码块&#xff0c;它在函数被调用时执行。 类型 函数名(形式参数) 代码块 与函数定义相反&#xff0c;函数声明出现在函数被调用的地方。 函数声明 编译器是如何知道该函数期望接受的是什么类型和多少数量的参数。 原型 int *find_int( int key…

ASPICE评估全流程解析:汽车软件开发组织能力的系统化评估

ASPICE&#xff08;Automotive SPICE&#xff09;评估的过程是一个系统化和详尽的流程&#xff0c;旨在评估汽车软件开发组织在软件开发过程方面的能力。 以下是ASPICE评估过程的详细描述&#xff1a; 1. 评估准备阶段 a. 确定评估目标和范围 明确评估的目标&#xff0c;如评…

同时拥有独显和核显,怎么让应用程序选择使用哪个GPU?

看你现在使用的是核显还是独显 勾选上GPU引擎选项&#xff0c;后面便会标识你所使用的是哪种显卡&#xff0c;如果是独立显卡&#xff0c;就可以免去后续的操作&#xff1b;如果不是&#xff0c;那么请继续接下来的操作。 将你需要使用独显的程序换成gpu1&#xff08;独显&am…