- spring web Http request 请求流程
- 服务器容器监听端口,接收到请求后调用Servlet的service方法。以Tomcat为例,Tomcat监听8080端口(8080为默认配置端口,也可以自行更改),当有请求到达8080端口时,容器将调用Servlet的service方法。javax.servlet.Servlet中定义了所有Servlet必须要实现的方法。在spring web中接收请求的servlet就是DispatcherServlet。
- 在service方法中判断请求类型是GET、POST、PUT......,然后调用相应的doGet()、doPost()、doPut()方法。
- 在doGet/doPost方法中执行processRequest()方法,processRequest()方法执行请求上下文的初始化过程。
- 调用doService()方法,由doService()方法执行doDispatch()方法。
- 最后由doDispatch方法去获取请求的mappedHandler和HandlerAdapter,处理完用户请求之后通过新建一个ServletWebRequest来渲染返回数据。
图片来自网络
如上图中(1)步骤:
请求首先通过ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse)方法调用DispatcherServlet的service(ServletRequest, ServletResponse)方法,但是DispatcherServlet中没有此方法,所以调用父类GenericServlet的抽象service(ServletRequest, ServletResponse)方法。最后请求到达HttpServlet.service(ServletRequest, ServletResponse)方法。源码如下
//HttpServlet.service方法的源码
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
通过debug源码,service(request,response)调用org.springframework.web.servlet.FrameworkServlet.service(HttpServletRequest, HttpServletResponse)方法。源码如下。
/**
* Override the parent class implementation in order to intercept PATCH requests.
*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());
if (httpMethod == HttpMethod.PATCH || httpMethod == null) {
processRequest(request, response);
}
else {
super.service(request, response);
}
}
FrameworkServlet接收到请求后将请求交个父类HttpServlet.service(HttpServletRequest, HttpServletResponse)处理,此方法中判断请求类型是get、post还是其他请求,更具请求类型调用相应的doGet、doPost方法。源码如下。
protected void service(HttpServletRequest req, HttpServletResponse