`
desert3
  • 浏览: 2158901 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Tomcat源码分析--HTTP,AJP请求内部处理流程

 
阅读更多
HTTP 1.1
server.xml配置使用HTTP1.1处理请求
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

AJP1.3协议Apache和Tomcat集成时使用,Apache处理静态内容,使用Apache的SSL,在很多应用环境下,比通过HTTP协议来访问单独的Tomcat有更加好的性能。在用户结合Engine的jvmRoute属性做loadbalance的时候使用到)
配置:
<Connector address="localhost" port="8081" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="600000"/>

Tomcat内部处理流程
1,HTTP请求发过来后,Tomcat从自己的线程池中提起出一个线程来处理
2,入口org.apache.tomcat.util.net.JIoEndpoint,该类用来处理传递进来的TCP连接,它实现了一个简单的服务器模式:一个监听线程用来接收socket以及为每个进来的连接创建一个worker来处理。更加高级的功能会涉及到线程重用,如队列等。
2#,入口org.apache.tomcat.util.net.AprEndpoint(APR定制线程池,提供Socket接收线程,Socket轮询线程,文件传输线程,Workers线程池);主方法run()监听进来的TCP/IP连接,并用合适的processor来处理。
3,根据Server.xml中配置的协议HTTP/1.1,调用org.apache.coyote.http11.Http11Protocol来后续处理。该类是HTTP1.1协议的实现类,包括线程功能。它处理单个线程和基于流的协议。但是不适用与JK协议如JNDI。主方法process(Socket socket)的内容如下:
  • a.从recycledProcessors中提取已有的processor,如果提取不到,那么创建一个(创建的时候会设置上HTTP1.1相应的一些属性如keepAliveTimeout以及生成request和response信息。注意此时request中还不包括画面提交上来的HTTP Header和Parameters等信息)
  • b.SSL相关设置
  • c.调用processor的process方法进行处理

3#,根据Server.xml中配置的协议AJP/1.3,调用org.apache.coyote.ajp.AjpAprProtocol来后续处理。主方法process(long socket)处理类似,如果从池中提取不到合适的processor,就生成并设置先关属性,然后调用processor的process方法。
4,org.apache.coyote.http11.Http11Processor该类用来处理HTTP请求。主方法process(Socket socket)的内容如下:
  • a.设置socket相关的地址变量和IO信息,即把socket.getInputStream()和socket.getOutputStream()转进来。其他socket.getInputStream()设置给InternalInputBuffer
  • b.调用InternalInputBuffer的parseRequestLine和parseHeader方法,把HTTP请求头内的相关信息读取处理,并使用prepareRequest方法保存到request中的相关变量上去。这时,HTTP Method, HTTP URI, HTTP QUERY STRING, HTTP PROTOCOL的值都是在这里被读取进来,这时候的URI还是没有被解码的,即还含有%XX的信息。
  • c.调用org.apache.catalina.connector.CoyoteAdapter的service方法继续处理

4#,org.apache.coyote.ajp.AjpAprProcessor的处理类似
5,CoyoteAdapter类实现了一个请求处理器(request processor),用来代理处置Coyote processor。主方法service(org.apache.coyote.Request req, org.apache.coyote.Response res)主要内容如下:
  • a.根据Connector来创建相应的Servlet Request和Servlet Response,并把connector配置中的getURIEncoding保存读取出来设置到QueryStringEncoding中,后面给QueryString解码的时候可能使用到,也可能被useBodyEncodingForURI覆盖!
  • b.调用postParseRequest方法处理其他的请求参数, 如果参数是通过HTTP POST方式传递进来的,那么把对应的比特数组存储起来,在第一次通过Request.getParameterValue()访问的时候解码得到真正的参数值,如果参数是通过HTTP GET方式传递进来,那么看connector.getURIEncoding有值,有的话在就用指定的字符集把未解码的URI对应的比特数组解码得到相应的值,否则直接读取未解码的字符,这也不会有问题,因为根据URI规范,URI采用US-ACSII编码,这时候的读取的char,还是有意义的,如%xx的形式。
  • c.调用Catalina引擎继续处理

6,org.apache.catalina.core.StandardEngineValve(默认的StandardEngine引擎实现)
  • a.主方法invoke(Request request, Response response),根据请求的server name,选取合适的Host继续处理请求

7,StandHost选择
  • a.org.apache.catalina.valves.AccessLogValve处理访问日志
  • b.org.apache.catalina.valves.ErrorReportValve根据response状态,输出相应的错误页面

8,org.apache.catalina.core. StandardContextValve(默认的StandardContext实现),处理和webapps下面具体项目的情况,如不允许请求直接访问项目下的/WEB-INF和/WEB-INF目录
9,org.apache.catalina.core. StandardWrapperValve(默认的StandardWrapper实现),调用和请求匹配的Servlet并Servlet的生命周期(如果Servlet有对应的filter,那么就调用它)和SingleThreadModel单线程模式的支持
10,org.apache.catalina.core. ApplicationFilterChain,实现了javax.servlet.FilterChain用来管理每个请求对应的Filter链的执行,所有Filter执行完成后调用servlet的service方法
11,javax.servlet.http.HttpServlet把ServletRequest请求转换成HttpServletRequest,调用相应Servlet的service方法提供服务。如果使用的是Struts框架,那么使用的是org.apache.struts.action. ActionServlet
12,Struts1.1框架使用RequestProcessor来处理真实的请求内容
13,后续就是调用相应的Action进行业务处理
14,注意,在第一次调用Request.getParameterValue("item")的时候,会进行转码操作,转码后相应的参数就是以Unicode的形式存在在jvm中,再根据需要可以传递各种形式的编码给客户端!(Unicode可以转换成任意字符集后,再输出[输出的其实是对应字符集的Byte数组])

调用RequestDispatcher.forward方法前后,对应的Request实现类不同,RequestDispatcher.forward前使用的是org.apache.catalina.connector.RequestFacade类而RequestDispatcher.forward后使用的是org.apache.catalina.core.ApplicationHttpRequest,他们内部在ParseParameter的时候, 用来解码的默认的编码逻辑不同,使用不同的协议时,影响乱码的因素不同! (request.getParameter和request.getParameterValues取值时,第一次请求需要解码!)

具体参考Tomcat源码分析--ServletRequest.getParameterValues内部分析,Request字符集&QueryStringEncoding
分享到:
评论

相关推荐

    tomcat-connectors-1.2.40-src.zip

    《深入解析Tomcat Connectors:基于1.2.40源码分析》 Tomcat Connectors,也称为Coyote,是Apache Tomcat服务器的核心组件之一,负责处理HTTP、AJP等网络协议的连接和通信。最新版本的`tomcat-connectors-1.2.40-...

    jakarta-tomcat-connectors-1.2.15-src.tar.gz

    深入学习jakarta-tomcat-connectors-1.2.15-src源码,可以提升对Tomcat工作流程的理解,包括请求的接收、处理、响应过程,以及如何通过连接器优化服务器性能。这对于进行性能调优、定制化开发或者排查系统问题都至关...

    tomcat-connectors-1.2.27-src.tar.gz

    《深入解析Tomcat Connectors:基于1.2.27源码分析》 Tomcat Connectors,也称为Coyote,是Apache Tomcat服务器的核心组件之一,它负责处理网络连接和HTTP协议。在深入理解Tomcat Connectors之前,我们需要先了解...

    tomcat-connectors-1.2.42-src.tar.gz

    【标题】"tomcat-connectors-1.2.42-src.tar.gz" 是Apache Tomcat服务器的一个源码包,主要用于实现Tomcat与Web服务器(如Apache HTTP Server)之间的连接器功能。这个版本号1.2.42表示这是Tomcat Connectors的一个...

    tomcat-coyote-7.0.34-sources.jar.zip

    通过分析这些源码,我们可以了解到Tomcat如何接收并解析HTTP请求,如何执行Servlet容器中的业务逻辑,以及如何生成和发送HTTP响应。这对于优化Tomcat的性能、理解和解决与Coyote相关的各种问题,或者进行自定义扩展...

    apache-tomcat-9.0.8-src可直接导入eclipse的源码

    了解并分析Tomcat源码对于深入理解Java Web应用的部署和执行机制非常有帮助。 源码包"apache-tomcat-9.0.8-src"包含了Tomcat的所有源代码,包括核心组件、模块和服务。它由多个子目录构成,每个目录对应Tomcat的...

    tomcat-connectors-1.2.26-src.tar.gz

    它们作为模块加载到Web服务器中,负责将HTTP请求转换为AJP请求,并将AJP响应转换回HTTP响应。这些连接器通过worker配置文件定义了Tomcat实例的连接和负载均衡策略。 三、源码分析 1. `jk`目录:这是mod_jk模块的源...

    jakarta-tomcat-connectors-jk2-src-current.tar.gz

    4. **源码分析** 解压“jakarta-tomcat-connectors-jk2-2.0.4-src”后,我们可以深入研究JK2的源代码结构,包括核心的模块、协议处理器、连接器实现等。通过阅读源码,开发者可以了解其实现原理,自定义配置,甚至...

    Tomcat 6.0 -- 9.0 及其源码

    1. 请求处理流程:当客户端发送请求到达Tomcat时,Coyote接收请求并将其转换为内部表示,然后传递给Catalina进行处理。Catalina通过Context、Wrapper和Servlet三级结构,找到对应的Servlet实例,执行其service方法。...

    tomcat-7.0.90-src-源码

    【标题】"Tomcat 7.0.90 源码分析" 【内容】Apache Tomcat 是一个开源的、高性能的Java Servlet容器,它实现了Java EE中的Web应用服务器规范,特别是Servlet和JSP规范。这里我们关注的是Tomcat 7.0.90的源码,这个...

    tomcat8源码-eclipse工程

    【描述】"tomcat8源码"意味着我们将探讨Tomcat 8的内部工作机制,包括它的架构、模块划分、请求处理流程、线程管理、连接器(Coyote)与容器(Catalina)的关系、类加载机制以及对Servlet、JSP、WebSocket等标准的...

    apache-tomcat-9.0.12-src.tar.gz

    3. 扩展开发:开发者可以创建自己的Servlet、Filter或Listener,实现与Tomcat的集成,或者开发新的Valve(请求处理组件)来改变请求处理流程。 五、性能优化 1. 端口调整:根据实际需求调整Tomcat的端口设置,如AJP...

    tomcat-6.0.18-src

    通过分析源代码,可以学习Tomcat如何处理HTTP请求,管理Servlet容器,以及如何执行JSP页面等核心功能。 【压缩包子文件的文件名称列表】中的"tomcat-6.0.18-src"和"apache-tomcat-6.0.18-src"是相同内容的不同命名...

    apache-tomcat-7.0.70-src

    此外,对于想要学习Java Web开发或者服务器管理的人来说,了解Tomcat源码也是一个宝贵的学习机会。你可以看到Tomcat如何处理HTTP请求,如何管理会话,以及如何与其他Java EE组件交互。这对于提升对Web服务器工作原理...

    tomcat源码

    3. **请求处理流程** 当一个HTTP请求到达时,Coyote适配器接收到请求,将其转化为内部表示,然后传递给Catalina进行处理。处理过程中,请求会经过一系列的过滤器,最后由对应的Servlet处理,完成业务逻辑后,响应...

    how-tomcat-works-master_howtomcatworks_

    "how-tomcat-works-master_howtomcatworks_"是一个关于Tomcat工作原理的源码分析项目,经过整理后可以在IntelliJ IDEA中直接运行,为开发者提供了一手的实践平台。 首先,我们要了解Tomcat的核心组件。Tomcat主要由...

    tomcat6-server-and-src

    通过分析源码,开发者可以学习到如何遵循Servlet和JSP规范进行服务器端开发,理解Tomcat如何处理请求、管理会话、调度线程等。此外,源码还便于开发者修复已知问题,优化性能,或添加特定的功能。 总之,`tomcat6-...

    apache-tomcat-7.0.85-src.zip

    这个压缩包“apache-tomcat-7.0.85-src.zip”包含了Tomcat 7.0.85版本的源代码,对于学习和理解Apache Tomcat的工作原理、内部机制以及Java Web应用部署流程来说,这是一个非常宝贵的资源。 源代码分析通常涉及以下...

    tomcat-connectors-1.2.37-src.tar.gz

    在描述中提到的"你懂得",暗示着这个源码包可能对于熟悉Tomcat内部机制的开发者具有特殊的含义。通过研究源码,我们可以深入理解Tomcat如何处理网络I/O,如何管理线程,以及如何实现高效的连接复用等关键特性。 在...

    Tomcat源码研究.pdf

    - **请求处理流程**:客户端请求首先被Connector接收,随后传递给相应的Container进行处理。Container负责解析请求、查找对应的Web应用程序并执行业务逻辑,最后返回响应结果。 - **扩展性**:Tomcat 6支持多种方式...

Global site tag (gtag.js) - Google Analytics