`
韩悠悠
  • 浏览: 827004 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

9.Tomcat的默认连接器

 
阅读更多

Tomcat连接器是一个可以插入servlet容器的独立模块,已经存在相当多的连接器了,包括Coyote, mod_jk, mod_jk2和mod_webapp
一个Tomcat连接器必须符合以下条件:
1. 必须实现接口org.apache.catalina.Connector。
2. 必须创建请求对象,该请求对象的类必须实现接口org.apache.catalina.Request。
3. 必须创建响应对象,该响应对象的类必须实现接口org.apache.catalina.Response。


Tomcat4的默认连接器类似于前面的简单连接器。它等待前来的HTTP请求,创建request和response对象,然后把request和response对象传递给容器。连接器是通过调用接口org.apache.catalina.Container的invoke方法来传递request和response对象的。

invoke的方法签名如下所示:

 public void invoke( org.apache.catalina.Request request, org.apache.catalina.Response response);

在invoke方法里边,容器加载servlet,调用它的service方法,管理会话,记录出错日志等等。

 


在很多地方使用字节数组来代替字符串

首先讨论HTTP1.1的三个新特性。理解它们是理解默认连接器内部工作机制的关键所在。


持久连接
在HTTP1.1之前,无论什么时候浏览器连接到一个web服务器,当请求的资源被发送之后,连接就被服务器关闭了。然而,一个互联网网页包括其他资源, 例如图片文件,applet等等。因此,当一个页面被请求的时候,浏览器同样需要下载页面所引用到的资源。加入页面和它所引用到的全部资源使用不同连接来 下载的话,进程将会非常慢。那就是为什么HTTP1.1引入持久连接的原因了。使用持久连接的时候,当页面下载的时候,服务器并不直接关闭连接。相反,它 等待web客户端请求页面所引用的全部资源.
持久连接是HTTP1.1的默认连接方式。同样,为了明确这一点,浏览器可以发送一个值为keep-alive的请求头部connection: connection: keep-alive


块编码
建立持续连接的结果就是,使用同一个连接,服务器可以从不同的资源发送字节流,而客户端可以使用发送多个请求。结果就是,发送方必须为每个请求或响应发送 内容长度的头部,以便接收方知道如何解释这些字节。然而,大部分的情况是发送方并不知道将要发送多少个字节。例如,在开头一些字节已经准备好的时 候,servlet容器就可以开始发送响应了,而不会等到所有都准备好。这意味着,在content-length头部不能提前知道的情况下,必须有一种 方式来告诉接收方如何解释字节流。
即使不需要发送多个请求或者响应,服务器或者客户端也不需要知道将会发送多少数据。在HTTP1.0中,服务器可以仅仅省略content-length 头部,并保持写入连接。当写入完成的时候,它将简单的关闭连接。在这种情况下,客户端将会保持读取状态,直到获取到-1,表示已经到达文件的尾部。 HTTP1.1使用一个特别的头部transfer-encoding来表示有多少以块形式的字节流将会被发送。对每块来说,在数据之前,长度(十六进 制)后面接着CR/LF将被发送。
状态100(持续状态)的使用
在发送请求内容之前,HTTP 1.1客户端可以发送Expect: 100-continue头部到服务器,并等待服务器的确认。这个一般发生在当客户端需要发送一份长的请求内容而未能确保服务器愿意接受它的时候。如果你 发送一份长的请求内容仅仅发现服务器拒绝了它,那将是一种浪费来的。 当接受到Expect: 100-continue头部的时候,假如乐意或者可以处理请求的话,服务器响应100-continue头部,后边跟着两对CRLF字符。 HTTP/1.1 100 Continue 接着,服务器应该会继续读取输入流。

 

 

 

Connector接口
Tomcat连接器必须实现org.apache.catalina.Connector接口。在这个接口的众多方法中,最重要的是getContainer,setContainer, createRequest和createResponse。 setContainer是用来关联连接器和容器用的。getContainer返回关联的容器。createRequest为前来的HTTP请求构造一个请求对象,而createResponse创建一个响应对象。

类org.apache.catalina.connector.http.HttpConnector是Connector接口的一个实现,


接口Lifecycle用来维护每个已经实现它的Catalina组件的生命周期。
实现Lifecycle,在创建HttpConnector实例之后,应该 调用它的initialize和start方法。这两个方法在组件的生命周期里必须只调用一次

 

为HTTP请求服务
HttpConnector类在它的run方法中有其主要的逻辑。run方法在一个服务端套接字等待HTTP请求的地方存在一个while循环,一直运行直至HttpConnector被关闭了。
while (!stopped) {
Socket socket = null;
try {
socket = serverSocket.accept();
 ...
对每个前来的HTTP请求,会通过调用私有方法createProcessor获得一个HttpProcessor实例。
HttpProcessor processor = createProcessor();
然而,大部分时候createProcessor方法并不创建一个新的HttpProcessor对象。相反,它从池子中获取一个。如果在栈中已经存在一 个HttpProcessor实例,createProcessor将弹出一个。如果栈是空的并且没有超过HttpProcessor实例的最大数 量,createProcessor将会创建一个。然而,如果已经达到最大数量的话,createProcessor将会返回null。出现这样的情况的 话,套接字将会简单关闭并且前来的HTTP请求不会被处理。

if (processor == null) {
try {
log(sm.getString("httpConnector.noProcessor"));
 socket.close();
 }
... continue;
如果createProcessor不是返回null,客户端套接字会传递给HttpProcessor类的assign方法:
processor.assign(socket);

现在就是HttpProcessor实例用于读取套接字的输入流和解析HTTP请求的工作了。重要的一点是,assign方法不会等到 HttpProcessor完成解析工作,而是必须马上返回,以便下一个
前来的HTTP请求可以被处理。


处理请求
关注HttpProcessor类的process方法,它是一个套接字赋给它之后,在HttpProcessor类的run方法中调用的。process方法会做下面这些工作:
解析连接
解析请求
 解析头部

 

 

解析连接
parseConnection方法从套接字中获取到网络地址并把它赋予HttpRequestImpl对象。它也检查是否使用代理并把套接字赋予请求对象
private void parseConnection(Socket socket) throws IOException, ServletException {
if (debug >= 2)
 log(" parseConnection: address=" + socket.getInetAddress() + ", port=" + connector.getPort());
 ((HttpRequestImpl) request).setInet(socket.getInetAddress());
 if (proxyPort != 0)
  request.setServerPort(proxyPort);
 else
  request.setServerPort(serverPort);
 request.setSocket(socket);
}

 

 

解析头部
默认链接器的parseHeaders方法使用包org.apache.catalina.connector.http里边的HttpHeader和DefaultHeaders类。类HttpHeader指代一个HTTP请求头部。类HttpHeader不使用字符串,而是使用字符数据用来避免昂贵的字符串操作。类DefaultHeaders是一个final类,在字符数组中包含了标准的HTTP请求头部:
standard HTTP request headers in character arrays:
static final char[] AUTHORIZATION_NAME = "authorization".toCharArray();
static final char[] ACCEPT_LANGUAGE_NAME = "accept-language".toCharArray();

 static final char[] COOKIE_NAME = "cookie".toCharArray();

分享到:
评论

相关推荐

    apr库(tomcat优化)

    包含以上是个包,只要应用于LINUX下,用于TOMCAT优化apr连接器使用的 说明下关于TOMCAT调优一种建议 1 Connector介绍  1.1 Connector的种类  Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector...

    Windows7系统IIS7+Tomcat集成

    三、 集成 Tomcat 1、连接器 jk 在 tomcat 的 bin 目录下新建目录 jk\,把下载的 isapi_redirect.dll(连接器,可从网上下载 http://mirror.bit.edu.cn/apache//tomcat/tomcat-connectors/jk/binaries/windows/ ,...

    《深入剖析Tomcat(中文版+英文版)》.rar

    第4章 tomcat的默认连接器 4.1 http 1.1的新特性 4.1.1 持久连接 4.1.2 块编码 4.1.3 状态码100的使用 4.2 connector接口 4.3 httpconnector类 4.3.1 创建服务器套接字 4.3.2 维护httpprocessor实例 4.3.3...

    springboot参考指南

    启用Tomcat的多连接器(Multiple Connectors) viii. 64.8. 在前端代理服务器后使用Tomcat ix. 64.9. 使用Jetty替代Tomcat x. 64.10. 配置Jetty xi. 64.11. 使用Undertow替代Tomcat xii. 64.12. 配置Undertow xiii....

    APACHE 2.2.9+TOMCAT6.0.18配置负载均衡

    只用用压力测试工具模拟大量用户同时访问,你会发现四个tomcat控制台均有打出控制信息,说明均衡器工作正常。 3、测试Session复制 访问url: http://localhost/examples/servlet/SessionExample 可以得到一个关于...

    apr库(tomcat优化) for native 20

    包含以上是个包,只要应用于LINUX下,用于TOMCAT优化apr连接器使用的 说明下关于TOMCAT调优一种建议 1 Connector介绍  1.1 Connector的种类  Tomcat源码中与connector相关的类位于org.apache.coyote包中,...

    tomcat8官网稳定版下载-免安装解压版

    Apache Tomcat 8支持最新的Java EE 7...现在默认的连接器实现是Java非阻塞实现,可用于HTTP和AJP 一个新的资源实现,可用于取代Aliases、VirtualLoader、VirtualDirContext、JAR资源和外部存储库,也可用于实现覆盖。

    how-tomcat-works中文版

    讲述Tomcat的工作原理 ...第4章 tomcat的默认连接器 第5章 container 第6章 生命周期(Lifecycle) 第7章 Logger 第8章 Loader 第9章 session管理 第10章 安全性 第11章 StandardWrapper 第12章 StandardContext类 ...

    how-tomcat-works

    第4章 tomcat的默认连接器 18 4.1 简介 18 4.2 HTTP1.1的新特性 18 4.2.1 持久化连接 18 4.2.2 编码 18 4.2.3 状态码100的使用 19 4.3 Connector接口 19 4.4 HttpConnector类 20 4.4.1 创建ServerSocket 20 4.4.2 ...

    HowTomcatWorks:《深度剖析Tomcat》原始码及笔记

    第四章Tomcat的默认连接器 第五章servlet容器 第六章生命周期 第七章日志记录器 第八章加载器 第九章会议管理 第十章应用程序 第十一章StandardWrapper 第十二章StandardContext 第十三章主机和引擎 第十四章服务器...

    websocket 解决链接失败问题

    tomcat运行在 5.0+以上版本。发包大小超出范围找到项目...-- websocket 发送内容长度设置(默认8192字节) --> <param-name>org.apache.tomcat.websocket.textBufferSize <param-value>5242800 </context-param>

    从连接器组件看Tomcat的线程模型——BIO模式(推荐)

    在高版本的Tomcat中,默认的模式都是使用NIO模式,在Tomcat 9中,BIO模式的实现Http11Protocol甚至都已经被删除了。但是了解BIO的工作机制以及其优缺点对学习其他模式有有帮助。只有对比后,你才能知道其他模式的...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    第4章 tomcat的默认连接器 18 4.1 简介 18 4.2 HTTP1.1的新特性 18 4.2.1 持久化连接 18 4.2.2 编码 18 4.2.3 状态码100的使用 19 4.3 Connector接口 19 4.4 HttpConnector类 20 4.4.1 创建ServerSocket 20 4.4.2 ...

    基于JavaWeb的期刊管理系统+课设报告.zip

    7、配置你的tomcat(idea右上角添加运行配置,导入你的tomcat,然后idea会提示修正项目,修正即可,之后,上面会显示工程访问路径,点击就可以访问 项目采用技术 ## 后端 1. Junit测试 2. JDK17 进行开发 3. 采用...

    java面试题

    83.9. 判断 104 83.10. 判断 104 83.11. 判断 105 84. 编码 106 84.1. 写出一个单例模式 106 84.2. 我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 106 84.3. ...

    hibernate3.04中文文档.chm

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class ...

    java开源包9

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    Hibernate3的帮助文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2...

    Save-Documents-Connector:在文件系统上保存所有文档的连接器

    保存文件连接器 ...转到workspace/tomcat/conf文件夹(假设您使用的是默认工作区) 编辑logging.properties文件 在文件末尾添加以下行: org.bonitasoft.connectors.SaveAllDocumentsOnFileSystemImpl.leve

Global site tag (gtag.js) - Google Analytics