tomcat中共有4个容器,采用了责任链的设计模式,每一个container定义了一个pipeline,每个pipeline又定义了多个value,代表需要处理的任务。pipeline就像是每个容器的逻辑总线,在pipeline上按照配置的顺序,加载各个value。通过piipeline完成个value之前的调用,各个value实现具体的应用的逻辑。

有了责任链设计模式的概念,http请求由connector转发至container,在container中的流程清晰了

请求在container中的流程:

image-20200111010129215

上一节中的Connector中的CoyoteAdapter会调用invoke()把request和response传给Container,Container中依次调用各个Valve,每个Valve的作用如下:

  • AccessLogValve:当开启记录访问日志时(springboot中默认不开启),是StandardEngine中的第一个阀门,主要用于管道执行结束之后记录日志信息
    • spring boot中开启设置server.tomcat.accesslog.enabled=true
  • StandardEngineValue:没做业务处理,直接把request,reponse传给host的默认容器StandardHost
  • ErrorReportValve:主要用于管道执行结束后,从request对象中获取异常信息,并封装到response中
  • StandardHostValve:把request,reponse传给context的默认容器StandardContext以及更新会话的最后访问时间
  • NonLoginAuthenticator:context中第一个value,用于身份进行验证,只会检查安全限制,不会涉及用户身份的验证
  • StandardContextValve:主要作用是禁止任何对WEB-INF或META-INF目录下资源的重定向访问,对应用程序热部署功能的实现;把request,reponse传给wrapper的默认容器StandardWrapper
  • StandardWrapperValve:StandardWrapper中的唯一阀门,主要作用包括调用StandardWrapper的loadServlet方法生成Servlet实例和调用ApplicationFilterFactory生成Filter链

总结

img