【问题标题】:How is a HTTP request decoded in spring?Spring中的HTTP请求是如何解码的?
【发布时间】:2020-06-10 19:19:00
【问题描述】:

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

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

【问题讨论】:

    标签: java spring http spring-mvc server


    【解决方案1】:

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

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

    servlet container 的作用是实现来自 JEE(现为 Jakarta EE)的 Servlet Specification。因此,servlet 容器负责监听 HTTP 端口(80、8080、443...),解析它接收到的 HTTP 请求,并通过 Servlet API 将它们公开给上层。

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

    servlet API 比较低级,直接使用它相当冗长乏味。这就是为什么像 Spring MVC(以及在此之前的 Struts 和许多其他框架)和 JSF 等 MVC 框架都是在它之上构建的。

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

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

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

    现在,如果您使用响应式端点 (Spring Web Reactive Framework)、it's a little different,则可能不会直接涉及 Servlet API。但那是另一回事了。

    【讨论】:

      【解决方案2】:

      似乎 Dispatcher servlet 负责解码 HTTP 请求,特别是 HttpServlet。根据this source(和其他一些人)的说法,Dispatcher Servlet 似乎有一堆子层:

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

      更实际地说,HttpServlet 是一个抽象类,它具有拆分的 service() 方法实现HTTP 方法类型的请求。

      更多关于 DispatcherServlet:

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

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

      Spring DispatcherServlet 正好提供了这一点。



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

      【讨论】:

        猜你喜欢
        • 2014-06-22
        • 2016-12-29
        • 2020-07-03
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 2015-10-05
        • 1970-01-01
        • 2011-08-03
        相关资源
        最近更新 更多