繁体   English   中英

spring中一个HTTP请求是如何解码的?

[英]How is a HTTP request decoded in spring?

所以我的问题是我觉得没有那么多解决的问题,我的问题很简单,当服务器接收到 HTTP 消息(请求)时,它是如何解码或处理的(假设服务器正在运行一个 spring mvc 应用程序)?

把我的问题放在上下文中,假设一个简单的 HTTP 消息由客户端发送到服务器,HTTP 消息在哪里解码? 从某种意义上说,某些逻辑或代码必须解析 HTTP 请求以查看其中包含的内容,我的问题是此操作在哪里发生? 这是调度程序 servlet 负责的事情吗? 应用程序容器,即 tomcat 是否负责解析/解码 HTTP 消息? 如果spring负责,请给出解码HTTP消息涉及哪些类。

似乎Dispatcher servlet负责解码 HTTP 请求,特别是HttpServlet 根据这个来源(以及其他一些来源),Dispatcher Servlet 似乎有一堆子层:

在此处输入图片说明

顾名思义,HttpServlet 类是以 HTTP 为中心的 Servlet 实现,也是由规范定义的。

在更实际的术语中,HttpServlet 是一个带有 service() 方法实现的抽象类,该类实现按 HTTP 方法类型拆分请求。

更多关于 DispatcherServlet:

作为 Web 应用程序的开发人员,我们真正想做的是抽象出以下乏味的样板任务,并专注于有用的业务逻辑:

  • 将 HTTP 请求映射到某种处理方法
  • 将 HTTP 请求数据和标头解析为数据传输对象 (DTO) 或域对象
  • 模型-视图-控制器交互
  • 从 DTO、域对象等生成响应。

Spring DispatcherServlet 正是提供了这一点。



PS:好问题! 我已经使用 Spring 一段时间了,但从未真正质疑过如此详细的流程。 谢谢你送我走这条路:)

Spring Web MVC 在 servlet 容器内运行,如Tomcat

即使在使用 Spring Boot 时,您不必将 WAR 文件显式部署到安装在您机器上的 Tomcat 实例,也有一个 Tomcat 实例(或另一个 servlet 容器,如 Jetty 或 Undertow - 不完全是 servlet 容器,但履行相同的角色)在您的 Spring Boot 应用程序中嵌入运行。

servlet 容器的作用是实现 JEE(现在的 Jakarta EE)的Servlet 规范 因此,servlet 容器负责侦听 HTTP 端口(80、8080、443...),解析它收到的 HTTP 请求,并通过 Servlet API 将它们暴露给上层。

同样,Servlet API 允许向客户端发送响应。 它将我们传递给它的 Java 对象和方法调用转换为正确的 HTTP 响应并通过网络发送它。

servlet API 相对较低级别,直接使用它非常冗长乏味。 这就是为什么 MVC 框架,例如 Spring MVC(以及之前的 Struts 和许多其他框架)以及 JSF 都建立在它之上的原因。

(请注意,并非所有 Java Web 框架都构建在 Servlet API 之上。Play! 框架就是这样的一个示例。)

因此,反过来,Spring MVC 使用 Servlet API 并在其基础上进行构建,并且大部分将其隐藏起来,以便向您(应用程序程序员)公开其自己的 API,并为您提供更多便利和功能,例如

  • 根据请求的 URL 将请求分派给您的控制器
  • 从请求正文中提取和解析 JSON 并将其作为 Java 对象公开给您
  • 帮助上传文件
  • 等等...

现在,如果您使用反应式端点( Spring Web 反应式框架),情况会有所不同,并且可能不会直接涉及 Servlet API。 但那是另一个故事了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM