Tomcat是如何处理http请求的

Tomcat有什么用?

Tomcat是一个应用服务器,也是一个Servlet容器,用来接收前端传过来的请求,并将请求传给Servlet,并将Servlet的响应返回给客户端。

Tomcat的体系结构

Tomcat的两大核心组件:Connector和Container

Connector负责在服务器端处理客户端的连接,接受客户端的消息报文以及消息报文的解析工作,并把解析后的内容发送给Container;而Container组件负责对客户端的请求进行逻辑处理,并把结果返回给客户端。

1、Connector

一个Connector组件负责监听某个端口的客户请求,接受来自客户的TCP连接请求,并创建一个request和一个response对象,然后产生一个线程来处理这个请求并把产生的Request和Response对象传给Engine组件,从Engine获取返回结果并返回给客户端。
Tomcat中的两个Connector
一个用于监听来自浏览器的请求,另一个用于监听来自其他webServer的请求。
Coyote HTTP/1.1 Connector用来监听8080端口来自客户端的请求;
Coyote JK2 Connector用来监听8009端口来自其他WebServer的请求。
Connector的作用
Connector的最重要的功能就是接收连接请求,创建Request和Response对象,并且分配线程让Container来处理请求,所以必然是多线程的,多线程是Connector的设计核心。

2、Container组件


Container是容器的父接口,它是由Engine,Host,Context,Wrapper组成。通常也给Servlet对应一个Wrapper,多个Servlet则需定义多个Wrapper,如果有多个Wrapper则需要定义Context容器,Context则必须定义在Host中,Host不是必须的,但如果要运行War包,则必须要Host,因为web.xml需要Host解析,如果有多个Host就需要定义更高一级的容器Engine。
Engine
简单的定义Host容器。
Host
Host是Engine的子容器,一个Host在Engine中代表一个虚拟主机,它的作用就是运行多个应用。
Context
Context是Servlet的Context,它用来管理Servlet实例,
Wrapper
Wrapper代表一个Servlet,它负责管理Servlet,包括Servlet的装载,初始化,执行,以及卸载。它是最底层的容器。

Tomcat处理一个HTTP请求的过程


(1)Tomcat启动后,Connector组件的接收器(Acceptor)将会监听是否有客户端连接
(2)监听到客户端连接,将连接交给连接池Executor处理,开始执行请求响应任务。
(3)HttpIIProcessor组件负责从客户端连接中读取消息报文,然后解析HTTP的请求行,然后调用Adapter.service()方法解析请求头和请求体。将解析后的报文组装成Request对象。org.apache.catalina.connector.CoyoteAdapter是Connector和Container的桥梁,调用Adapter.service()方法之后便将封装了Request和Response传递给Container了。
(4)Engine容器处理请求调用了StandardEngineValve的invoke方法,选择合适的Host处理请求。
(5)调用Host的invoke方法,根据URL选择出一个Context容器
(6)调用Wrapper容器的invoke方法,把处理请求交给StandardWrapperValve处理。
假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为””的Context去处理)
7) path=”/wsota”的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser
引用:https://blog.csdn.net/sky_100/article/details/77541968

Tomcat一的更多相关文章

  1. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  2. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  3. Tomcat shutdown执行后无法退出进程问题排查及解决

    问题定位及排查 上周无意中调试程序在Linux上ps -ef|grep tomcat发现有许多tomcat的进程,当时因为没有影响系统运行就没当回事.而且我内心总觉得这可能是tomcat像nginx一 ...

  4. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  5. Linux CentOS 配置Tomcat环境

    一.下载Tomcat 下载Tomcat方式也有两种,可以参考我的前一篇博文Linux CentOS配置JDK环境,这边就不再赘述. 二.在Linux处理Tomcat包 1.创建tomcat文件夹 mk ...

  6. 在Linux虚拟机下配置tomcat

    1.到Apache官网下载tomcat http://tomcat.apache.org/download-80.cgi 博主我下载的是tomcat8 博主的jdk是1.8 如果你们的jdk是1.7或 ...

  7. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  8. Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法

    有的项目引用了太多的jar包,或者反射生成了太多的类,异或有太多的常量池,就有可能会报java.lang.OutOfMemoryError: PermGen space的错误, 我们知道可以通过jvm ...

  9. mac下安装及配置tomcat

    mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...

  10. 设置tomcat远程debug

    查看端口占用情况命令: netstat -tunlp |grep 8000 tomcat 启动远程debug: startup.sh 中的最后一行 exec "$PRGDIR"/& ...

随机推荐

  1. 【Lintcode】075.Find Peak Element

    题目: There is an integer array which has the following features: The numbers in adjacent positions ar ...

  2. MySQL整体架构与内存结构

    一  mysql 整体框架: MySQL是由SQL接口,解析器,优化器,缓存,存储引擎等组成的. 1. Connectors指的是不同语言中与SQL的交互. 2. Management Serveic ...

  3. 为VSFTP用户指定登录后的目录.原创测试通过.

    VSFTP用户目录指定1修改VSFTP配置文件Vi /etc/vsftpd/vsftp.conf  #启动chroot列表chroot_list_enable=YES#指定列表位置chroot_lis ...

  4. Vijos1579:宿命的PSS

    背景 P.S.S:“我来自哪里?”WH:“你来自一个图.”P.S.S:“我是谁?”WH:“你是最小生成树.”P.S.S:“我又要到哪里去?”WH:“你要成为一个最小完全图(边权之和最小的完全图).”P ...

  5. 用fpm模式在虚拟主机上安装phpmyadmin

    实验环境:CentOS7 1.配置虚拟主机 [root@conf.d localhost]#vi /etc/httpd/conf.d/vhost.conf #配置在/etc/httpd/conf.d下 ...

  6. Virtualenwrapper

    1. Introduction Virtualenvwrapper is a set of extensions to Ian Bicking's virtualenv tool. The exten ...

  7. 希尔排序(java)

    希尔排序是对直接插入排序的一种优化,基本思想是把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序:小组的个数逐次缩小:当完成了所有数据元素都在一个组内的排序后排序过程结束.希尔排 ...

  8. 虚拟机中的Linux安装VMware Tools

    虚拟机中的Linux安装VMware Tools Tools" TITLE="虚拟机中的Linux安装VMware Tools" /> Tools" TI ...

  9. 《精通Spring4.X企业应用开发实战》读后感第五章(<bean>之间的关系\整合多个配置文件)

  10. Elasticsearch检索分类详解

    前言 Elasticsearch中当我们设置Mapping(分词器.字段类型)完毕后,就可以按照设定的方式导入数据. 有了数据后,我们就需要对数据进行检索操作.根据实际开发需要,往往我们需要支持包含但 ...