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. 1066 Bash 游戏

    传送门 1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1 ...

  2. 【Python】数组排序

    1.numpy库:argsort() argsort函数返回的是数组值从小到大的索引值(升序排列) 一维: In [1]: import numpy as np In [2]: x = np.arra ...

  3. MongoDB 分片的原理、搭建、应用 !

    MongoDB 分片的原理.搭建.应用   一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处 ...

  4. SQL 优化总结(三) SQL子句

    SQL子句 尽可能编写优化器可以优化的语句. 1. SELECT子句 (1) 在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了 ...

  5. Poj_1005_I Think I Need A HouseBoat

    一.Description Fred Mapper is considering purchasing some land in Louisiana to build his house on. In ...

  6. Docker入门(六):Stacks

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  7. deprecated conversion from string constant to ‘char*’

    deprecated conversion from string constant to ‘char*’ #include <iostream> using namespace std; ...

  8. Silverlight 5 系列学习之二

    昨天学习了一下Silverlight基础感觉也没有什么特别之处,不过圈里朋友劝我不要深入学习了,因为ms已不再爱他的这个孩子了,好吧那就把上些简单的东西稍微过一下吧,要不然公司有什么需求要改的小弟不会 ...

  9. Collection与Map总结

    顺序表和链表统称为线性表:顺序表一般表现为数组,如:ArrayList的实现;链表有单链表.双链表.循环链表的区分,如:LinkedArrayList由双链表+哈希表实现

  10. day1 java基础回顾- Properties类与配置文件

    Properties配置文件说明 Properties类对应.properties文件.文件内容是键值对,键值对之间使用"="或空格隔开.开头是"#"的表示注释 ...