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会创建HttpServletRequestHttpServletResponse对象,这两个对象封装了HTTP请求和响应的所有信息。


Step 3. 过滤器链(Filter Chain)

在请求到达Servlet之前,Tomcat会先经过一系列的过滤器(Filter)。这些过滤器可以对请求和响应进行预处理和后处理。过滤器链的处理步骤如下:

  • 过滤器初始化:在Web应用启动时,Tomcat会根据web.xml或注解配置初始化所有过滤器。
  • 过滤器调用:Tomcat会按顺序调用过滤器链中的每个过滤器的doFilter方法。过滤器可以对请求进行修改或校验,或者直接生成响应而不继续传递请求。
  • 过滤器链结束:如果所有过滤器都通过,Tomcat将请求传递给下一个组件(通常是Servlet)。
1
2
3
4
5
6
7
8
9
10
11
12
public class MyFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 请求预处理
System.out.println("Request received.");

// 继续处理请求
chain.doFilter(request, response);

// 响应后处理
System.out.println("Response generated.");
}
}

Step 4. Servlet 处理

过滤器链处理完成后,请求被传递到对应的Servlet进行处理。Servlet的处理步骤如下:

  • Servlet初始化:在Web应用启动时,Tomcat会根据web.xml或注解配置初始化所有Servlet。
  • Servlet调用:Tomcat会调用请求对应的Servlet的service方法,service方法会根据请求的HTTP方法(GET、POST等)调用相应的doGetdoPost等方法。
  • 响应生成: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
2
客户端 -> Tomcat -> 过滤器链(Filter Chain) -> Servlet -> DispatcherServlet
-> 拦截器链(Interceptor Chain) -> Controller -> 视图解析 -> 响应生成 -> 客户端