Tomcat源码阅读之请求过程

来源:互联网 发布:tech域名不能备案 编辑:程序博客网 时间:2024/06/07 02:09

Tomcat接收到请求之后便进行解析请求的工作。解析Http请求是个非常复杂的过程,比如解析请求头,解析请求行,解析参数等过程都比较复杂。对解析Http请求过程感兴趣的同学可以结合Http协议相关的资料深入研究。
Http请求解析完的数据会填充到request对象中,注意是org.apache.coyote.Request类型的对象。这个类是Tomcat内部使用的描述请求的信息类,作用就是在服务器接收到请求后,经过解析将这个请求快速分配给后续线程去处理。后续在处理这个请求的时候也会创建一个request对象,不过是org.apache.catalina.connector.Request类型的。这个对象会一直贯穿整个请求过程,直到处理请求那一步。
请求解析完之后,需要关联相应的容器处理请求。那么问题来了,Tomcat是如何将请求最终交给Servlet处理呢?Tomcat用到了两个组件,分别是Pipeline(管道)和Valve(阀)。每一个Container容器可以有一条管道,可以在这个管道上添加任意的阀,可以通过编辑server.xml来动态的添加阀,当一个阀执行完之后,会调用下一个阀继续执行,最后执行基础阀。阀对应的对象都实现了Value接口,主要的逻辑在invoke方法,执行阀其实就是调用其invoke方法进行处理。每个Container容器都有一个基础阀,根据容器等级从高到低依次为StandardEngineValve,StandardHostValve,StandardContextValve,StandardWrapperValve。容器的基础阀设置是在容器实例化的时候。
最后要执行的一个阀是StandardWrapperValve,对应的容器为Wrapper。Wrapper代表一个Servlet,Http请求的处理过程就封装在StandardWrapperValve的invoke方法中,到这里成功将请求传递给了相应的Servlet进行处理,那么接下来便是处理请求的过程了。

0 0
原创粉丝点击