Tomcat 中使用的容器连接器必须满足以下要求:

  • 实现 org.apache.catalina.Connector 接口
  • 负责创建实现了 org.apache.catalina.Request 接口的 request 对象
  • 负责创建实现了 org.apache.catalina.Response 接口的 response 对象

它会等待 HTTP 请求,创建 request 对象和 response 对象,然后调用 org.apache.catalina.Contatiner 接口的 invoke 方法,将 request 对象和 response 对象传给 servlet 。invoke() 方法的签名如下:

public void invoke(

org.apache.catalina.Request request,

org.apache.catalina.Response reponse);

在 invoke() 方法内部,servlet 容器会载入相应的 servlet 类,调用其 service() 方法,管理 session 对象,记录错误消息等操作。

tomcat 中的连接器是一个独立的模块,可以被插入到 servlet 容器中,而且还有很多连接器可以使用。例如 Coyote, mod_jk, mod_jk2 和 mod_webapp 等。

tomcat4 中的默认连接器实现了 HTTP1.1 的全部新特性

HTTP 1.1 新特性

1.支持长连接(connection: keep-alive)

HTTP1.1 之前,Server处理完浏览器的请求后会立即断开连接。每次浏览器申请一个资源的时候都需要建立一个连接,而一个页面往往包含了很多资源,图片、CSS文件、脚本文件,Flash文件等,所以每次用户打开一个页面需要浏览器和Server建立很多连接,进而耗费很多资源,速度慢。HTTP1.1引入了长连接的机制,在长连接模式下浏览器下载一个页面时,服务器段并不断开链接直到页面的所有资源都下载完毕。这种机制的引入减少很多用户浏览网页时建立连接和关闭连接的损耗,增加了互联网的浏览效率。

浏览器请求没有发送完毕前,所有HTTP请求的头部都带有这个标识:
connection: keep-alive
这个时候Server应该一直接收这个流,不断处理流中的HTTP请求,不能断开连接。

直到最后一个请求,浏览器发送的HTTP请求的头部带有这个标识:
connection: close
Server读取完本请求后,不再读取这个连接中请求流中的数据,断开连接。

2.分块模式传输数据(transfer-encoding:chunked )
在长链接上,服务器可能会给浏览器发送一个包含多个资源的字节流应答,浏览器也有可能在请求流中携带多个资源。请求和应答时,必须在包头中说明本包的字节数,这样接收者能够根据这个值截断流读取有效数据。而实际情况是,服务器和浏览器在组包的时候并不能确切得知道本包的字节数。比如,Servlet在应答请求的时候,并不必须等到所有事务处理都完成,而是可以先返回准备好的几个字节,等其他事务处理完了再返回这些迟到的事务产生的数据。这种情况需要让接收者知道如何截取数据,如果包头没有包的字节数数据的话。在HTTP1.0时代,服务器端只好把 content-length 字段留空,然后继续返回字节流。数据发送完成后,简单关闭连接,在结尾处加一个-1表示文件流结束了。HTTP1.1使用了一个特殊的头字段 transfer-encoding:chunked 来标识本次流传输是分块进行的,每一块的长度以16进制的形式写在块头,回车符之前。每次以分块模式传输的数据,最后一块的的字节数为0。下面是一个例子,该流总长度为38字节,分两块发送,第一块长度是29字节(16进制是 1D),第二块长度是9字节:
"I'm as helpless as a kitten up a tree." ,发送的流是下面这个样子:
1D\r\n I'm as helpless as a kitten u 9\r\n p a tree. 0\r\n

3.使用100-continue请求服务器能力反馈
HTTP1.1允许客户端在发送请求包的报文体之前发送报文头使用Expect: 100-continue来等待服务器的反馈,确认是否允许发送该请求报文的报文体。这种情况通常发生在客户端准备发送一个冗长的请求给服务器,但是不确认服务器是否有能力接收。如果没有得到确认,而将一个冗长的请求包发送给服务器,然后包被服务器给抛弃了,这种情况挺浪费资源的。一旦服务器收到100-continue的请求头,如果此时能够处理该请求,立即给客户端返回响应头 HTTP/1.1 100 Continue 加两个回车符,这时服务器端可以继续读取该请求流了。

Connector 接口

tomcat 的连接器必须实现 org.apache.catalina.Connector 接口。在接口声明中,最重要得是

setContainer() 方法用于将连接器和某个 servlet 容器相关联

getContainer() 方法返回与当前连接器相关联的 servlet 容器

createRequest() 方法为引入的 HTTP 请求创建 request 对象

createResponse() 方法会创建一个 response 对象

连接器与 servlet 容器是一对一的关系,与 HttpProcessor 类是一对多的关系。

HttpConnector 类

实现了 org.apache.catalina.Connector 接口,使其可以成为 Catalina 中的连接器

实现了 java.lang.Runable 接口,确保它的实例在自己的线程中运行

实现了 org.apache.catalina.LifeCycle 接口,用于维护每个实现了该接口的每个 Catalina 组件的生命周期

tomcat 3 - 默认连接器的更多相关文章

  1. 攻城狮在路上(伍)How tomcat works(四)Tomcat的默认连接器

     在第4章中将通过剖析Tomcat4的默认连接器的代码,讨论需要什么来创建一个真实的Tomcat连接器.     注意:本章中提及的“默认连接器”是指Tomcat4的默认连接器.即使默认的连机器已经被 ...

  2. how tomcat works 读书笔记四 tomcat的默认连接器

    事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...

  3. Tomcat剖析(四):Tomcat默认连接器(2)

    Tomcat剖析(四):Tomcat默认连接器(2) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三): ...

  4. Tomcat剖析(四):Tomcat默认连接器(1)

    Tomcat剖析(四):Tomcat默认连接器(1) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三): ...

  5. tomcat源码阅读之默认连接器

    默认连接器 一.UML图: 1.所有的连接器都要实现Connector接口,必须创建Request对象和Response对象,httpConnector作为默认连接器,肯定也是要实现Connector ...

  6. javaweb学习总结十八(软件密码学、配置tomcat的https连接器以及tomcat管理平台)

    一:软件密码学 1:对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key).对称加密有很多种算法,由于它效 ...

  7. Tomcat 七 HTTP 连接器

    摘要 本文尝试翻译Tomcat官方文档Apache Tomcat 7连接器,不足之处敬请指正.该文先介绍了Tomcat7 HTTP连接器的属性,包括:公共属性.标准实现.Java TCP套接字属性.B ...

  8. 【转】Tomcat的默认访问路径

    放在外网的应用,用户多是直接输入域名访问,相信没有哪个后面还加个尾巴,而Tomcat的默认目录是ROOT,所以我们需要更改其默认目录. 更改Tomcat的默认目录很简单,只需要修改server.xml ...

  9. Tomcat 配置 默认应用 (去掉项目名称、移除项目名称)

    Tomcat 配置默认应用,即只输入域名或ip,不用输入项目名称: <Host name="localhost" appBase="webapps" un ...

  10. Tomcat设置默认启动项目及Java Web工程设置默认启动页面

    Tomcat设置默认启动项目 Tomcat设置默认启动项目,顾名思义,就是让可以在浏览器的地址栏中输入ip:8080,就能访问到我们的项目.具体操作如下: 1.打开tomcat的安装根目录,找到Tom ...

随机推荐

  1. 如果还有问ARKIME不会部署安装,你就把这篇丢给他!

    前言 关于在线安装和离线安装的配合方式,在本文中不再赘述.基本就是准备在线.离线两个一模一样的环境,在在线环境中边安装边借助yumdownloader.wget等解析依赖和下载安装包,然后再离线环境中 ...

  2. GitLab能通过ssh克隆无法通过http克隆,也无法进行流水线,提示port 80: Connection refused

    问题记录:VM-Ubuntu20.04刚开始时使用NAT模式连接,后来改成桥接模式,改完之后原来使用docker启动的gitlab服务无法克隆,一直提示:fatal...没有远程库什么的,没解决后来删 ...

  3. 066_VFPage中Js Button与controller交互方式(一)

    这种方式经常被用来,在button中处理一些逻辑,做法是在detail 页面中加一个button,对应是jS执行调用invoke controller Define a webService meth ...

  4. 如何将视频作为Windows桌面动态壁纸,两步就可以搞定!

    Windows本身自带的设置是不支持直接将视频用作壁纸,所以要想实现这个功能需要第三方工具的帮助 一.软件简介 这是一款可以将视频文件作为动态壁纸展示在电脑桌面的软件,它体积小巧,占用资源也不多,相比 ...

  5. C#连Mysql数据库报错 SSL Connection error

    MySql.Data.MySqlClient.MySqlException (0x80004005): SSL Connection error. ---> System.AggregateEx ...

  6. shell_Day04

    grep程序 Linux下有文本处理三剑客 -- grep sed awk grep:文本 行过滤工具 sed: 文本 行编辑器(流编辑器) awk:报告生成器(做文本输出格式化) grep 包含三个 ...

  7. .NET Core基础:白话管道中间件

    在Asp.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景 ...

  8. Amd,Cmd, Commonjs, ES6 import/export的异同点

    Amd,Cmd, Commonjs, ES6 import/export等均是模块化方案 1.Commonjs使用在Nodejs上,加载模块是同步的. 2.Amd是requirejs在推广过程中对模块 ...

  9. 实验1task4

    <实验结论> #include <stdio.h> #include <stdlib.h> int main() { int x, t, m; x = 123; p ...

  10. pytest设计项目结构

    api目录封装所有的接口 testcases目录写所有的测试用例.conftest全局登录前置操作 data目录测试数据 common或者utils目录.存放公共模块比如读取yml文件.连接数据库.所 ...