zoukankan      html  css  js  c++  java
  • Tomcat一

    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
  • 相关阅读:
    windows(win10)下的mysql解压版安装
    微信和QQ网页授权登录
    图片前端重绘前端压缩和自动调整旋转
    时间的显示
    magento中文语言包的使用
    div垂直居中(js)
    centOS IP能ping通但是域名ping不通
    python3 使用pyinstaller打包exe 指定虚拟路径模块
    Flask 多app案例
    将excel的资产数据生成二维码图片
  • 原文地址:https://www.cnblogs.com/ozho/p/10623567.html
Copyright © 2011-2022 走看看