http从请求到响应
http从请求到响应
在一个标准的Java Web应用中,当一个HTTP请求从Tomcat到Controller的过程中,会经历多个阶段,包括Tomcat的请求处理、Filter链的处理、Servlet的处理、Interceptor拦截以及最终的Controller处理。
Step 1. Tomcat 接收到请求
当客户端(例如浏览器)发送一个HTTP请求时,Tomcat作为Web服务器首先接收到该请求。Tomcat会根据请求的URL找到对应的Web应用,并将请求交给该Web应用的Servlet容器进行处理。
Step 2. 创建 HttpServletRequest 和 HttpServletResponse 对象
Tomcat会创建HttpServletRequest
和HttpServletResponse
对象,这两个对象封装了HTTP请求和响应的所有信息。
Step 3. 过滤器链(Filter Chain)
在请求到达Servlet之前,Tomcat会先经过一系列的过滤器(Filter)。这些过滤器可以对请求和响应进行预处理和后处理。过滤器链的处理步骤如下:
- 过滤器初始化:在Web应用启动时,Tomcat会根据
web.xml
或注解配置初始化所有过滤器。- 过滤器调用:Tomcat会按顺序调用过滤器链中的每个过滤器的
doFilter
方法。过滤器可以对请求进行修改或校验,或者直接生成响应而不继续传递请求。- 过滤器链结束:如果所有过滤器都通过,Tomcat将请求传递给下一个组件(通常是Servlet)。
1 | public class MyFilter implements Filter { |
Step 4. Servlet 处理
过滤器链处理完成后,请求被传递到对应的Servlet进行处理。Servlet的处理步骤如下:
- Servlet初始化:在Web应用启动时,Tomcat会根据
web.xml
或注解配置初始化所有Servlet。- Servlet调用:Tomcat会调用请求对应的Servlet的
service
方法,service
方法会根据请求的HTTP方法(GET、POST等)调用相应的doGet
、doPost
等方法。- 响应生成:Servlet会处理业务逻辑,并生成响应数据,写入
HttpServletResponse
对象。
Step 5. Spring MVC 拦截器(Interceptor)
如果使用了Spring MVC框架,Servlet会将请求进一步传递给Spring的DispatcherServlet。DispatcherServlet会调用配置的拦截器(Interceptor)。拦截器的处理步骤如下:
- 前置处理:拦截器的
preHandle
方法在Controller处理之前调用,可以进行权限校验、日志记录等操作。- 后置处理:拦截器的
postHandle
方法在Controller处理之后、视图渲染之前调用,可以对ModelAndView进行修改。- 完成处理:拦截器的
afterCompletion
方法在整个请求处理完成之后调用,可以进行资源清理等操作。
Step 6. Controller 处理
最终,DispatcherServlet会将请求交给对应的Controller处理。Controller的处理步骤如下:
- 请求映射:DispatcherServlet根据请求URL找到对应的Controller方法(通过注解如
@RequestMapping
)。- 方法调用:调用Controller方法,处理业务逻辑。Controller方法可以返回视图名称或数据对象。
- 视图解析:如果Controller方法返回的是视图名称,DispatcherServlet会使用视图解析器(ViewResolver)解析视图并进行渲染。如果返回的是数据对象(例如JSON),则直接写入响应。
Step 7. 生成响应
最终,处理结果会写入到HttpServletResponse
对象中,Tomcat将该响应发送回客户端。
Step 8. 完成请求
Tomcat完成请求处理,关闭连接或保持连接(如果是Keep-Alive)。
通过以上步骤,一个HTTP请求从Tomcat到Controller的详细处理过程如下图所示:
1 | 客户端 -> Tomcat -> 过滤器链(Filter Chain) -> Servlet -> DispatcherServlet |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CautionX!