- 浏览: 214061 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
jacktao219:
赞一个! 好文,但实际测试后发现第一次 浏览器也木有把url ...
Tomcat 7源码学习笔记 -6 encodeURL深度解析补充 -
mengsanjunqq:
Tomcat 7源码学习笔记 -3 Http11Protocol和Http11NioProtocol -
di1984HIT:
写的很好啊~~~
使用nodejs异步方法导致进程无法退出的问题 -
sygjzmh:
...
诡异的prototype -
blogzhoubo:
小蝶兒 写道这样子和直接放在head里有什么区别呐,还是没有解 ...
通过innerHTML动态插入的script无法执行的解决方法
前一篇文章写到SocketProcessor的run方法,这次继续说明后续的处理流程。
1.在之前的Http11Protocol构造方法中,创建JIoEndpoint对象以后,接着指定了handler,就是Http11ConnectionHandler对象。
2.所以SocketProcessor的run方法中,直接调用了handler.process(socket,status)。这个process方法在Http11ConnectionHandler的父类AbstractConnectionHandler中定义。
3.接着,在process方法中回调Http11ConnectionHandler中的createProcessor()方法,createProcessor()方法会创建一个Http11Processor对象并返回。然后process方法中会继续调用Http11Processor对象的process(SocketWrapper<S> socketWrapper)方法。
4.process(SocketWrapper<S> socketWrapper)方法定义在Http11Processor的父类AbstractHttp11Processor中,从这个process方法开始,才正式进入了对request请求的处理。
5.process方法的大致处理如下
a.从socket中获得inputstream和outputstream,分别设置到Http11Processor类中的InternalInputBuffer和InternalOutputBuffer中
InternalInputBuffer类里面的inputStream成员变量保存从socket中获得的inputstream,父类AbstractInputBuffer中有request成员变量Request request
InternalOutputBuffer类里面的outputStream成员变量保存从socket中获得的outputstream,父类AbstractOutputBuffer中有response成员变量Response response
b.调用InternalInputBuffer类的parseRequestLine方法,该方法内部从inputStream里面读取http请求头header信息,进行分析后把header中的信息设置到request中,如:
method,requestURI,protocol。
c.调用prepareRequest方法,对该请求的filter进行设置。
在前面的3.中,构造Http11Processor对象的时候,会调用initializeFilters方法向
InternalInputBuffer和InternalOutputBuffer中添加标准的filter
d.prepareRequest方法中调用addInputFilter方法,根据请求header中的transfer-encoding的值来选择要添加的filter。
transfer-encoding:
identity的时候,不添加filter
chunked的时候,添加ChunkedInputFilter
buffered的时候,添加BufferedInputFilter
void的时候,添加VoidInputFilter
如果header中没有transfer-encoding,那么从header中取content-length,如果content-length >= 0,那么添加IdentityInputFilter。否则,添加VoidInputFilter。
e.调用CoyoteAdapter类中的service(request, response)方法来处理请求。
f.请求处理完以后,调用endRequest()方法结束请求,向客户端返回响应。
6.请求处理完以后,当前的请求处理线程结束。2.中的SocketProcessor的run方法结束。
关于e.中的service(request, response)方法的处理细节,下回继续分解。
1.在之前的Http11Protocol构造方法中,创建JIoEndpoint对象以后,接着指定了handler,就是Http11ConnectionHandler对象。
public Http11Protocol() { endpoint = new JIoEndpoint(); cHandler = new Http11ConnectionHandler(this); ((JIoEndpoint) endpoint).setHandler(cHandler); setSoLinger(Constants.DEFAULT_CONNECTION_LINGER); setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT); setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY); }
2.所以SocketProcessor的run方法中,直接调用了handler.process(socket,status)。这个process方法在Http11ConnectionHandler的父类AbstractConnectionHandler中定义。
3.接着,在process方法中回调Http11ConnectionHandler中的createProcessor()方法,createProcessor()方法会创建一个Http11Processor对象并返回。然后process方法中会继续调用Http11Processor对象的process(SocketWrapper<S> socketWrapper)方法。
4.process(SocketWrapper<S> socketWrapper)方法定义在Http11Processor的父类AbstractHttp11Processor中,从这个process方法开始,才正式进入了对request请求的处理。
5.process方法的大致处理如下
a.从socket中获得inputstream和outputstream,分别设置到Http11Processor类中的InternalInputBuffer和InternalOutputBuffer中
InternalInputBuffer类里面的inputStream成员变量保存从socket中获得的inputstream,父类AbstractInputBuffer中有request成员变量Request request
InternalOutputBuffer类里面的outputStream成员变量保存从socket中获得的outputstream,父类AbstractOutputBuffer中有response成员变量Response response
// Setting up the I/O setSocketWrapper(socketWrapper); getInputBuffer().init(socketWrapper, endpoint); getOutputBuffer().init(socketWrapper, endpoint);
b.调用InternalInputBuffer类的parseRequestLine方法,该方法内部从inputStream里面读取http请求头header信息,进行分析后把header中的信息设置到request中,如:
method,requestURI,protocol。
c.调用prepareRequest方法,对该请求的filter进行设置。
在前面的3.中,构造Http11Processor对象的时候,会调用initializeFilters方法向
InternalInputBuffer和InternalOutputBuffer中添加标准的filter
/** * Initialize standard input and output filters. */ protected void initializeFilters(int maxTrailerSize) { // Create and add the identity filters. getInputBuffer().addFilter(new IdentityInputFilter()); getOutputBuffer().addFilter(new IdentityOutputFilter()); // Create and add the chunked filters. getInputBuffer().addFilter(new ChunkedInputFilter(maxTrailerSize)); getOutputBuffer().addFilter(new ChunkedOutputFilter()); // Create and add the void filters. getInputBuffer().addFilter(new VoidInputFilter()); getOutputBuffer().addFilter(new VoidOutputFilter()); // Create and add buffered input filter getInputBuffer().addFilter(new BufferedInputFilter()); // Create and add the chunked filters. //getInputBuffer().addFilter(new GzipInputFilter()); getOutputBuffer().addFilter(new GzipOutputFilter()); pluggableFilterIndex = getInputBuffer().getFilters().length; }
d.prepareRequest方法中调用addInputFilter方法,根据请求header中的transfer-encoding的值来选择要添加的filter。
transfer-encoding:
identity的时候,不添加filter
chunked的时候,添加ChunkedInputFilter
buffered的时候,添加BufferedInputFilter
void的时候,添加VoidInputFilter
如果header中没有transfer-encoding,那么从header中取content-length,如果content-length >= 0,那么添加IdentityInputFilter。否则,添加VoidInputFilter。
e.调用CoyoteAdapter类中的service(request, response)方法来处理请求。
f.请求处理完以后,调用endRequest()方法结束请求,向客户端返回响应。
getInputBuffer().endRequest(); getOutputBuffer().endRequest();
6.请求处理完以后,当前的请求处理线程结束。2.中的SocketProcessor的run方法结束。
关于e.中的service(request, response)方法的处理细节,下回继续分解。
发表评论
-
云时代,Java程序猿们何去何从
2018-01-18 18:59 993欢迎关注微信公众 ... -
java编程中的缺省时区问题
2017-06-10 12:56 1073java编程的过程中,一般都会用到日期时间的处理,既然涉及到时 ... -
调查问卷动态生成的一点探索
2017-02-27 16:32 1905之前做过企业内部用的调查问卷系统,因为每一年的调查内容都有 ... -
spring和mybatis的整合方式
2017-02-27 14:30 18291.Dao类继承org.mybatis.spring.sup ... -
struts和spring的整合方式对比
2017-02-27 09:51 12151.业务Action类继承ActionSupport类 ... -
java mail发送邮件
2017-02-23 16:14 1090业务场景 在公司内部的linux主机上,通过 ... -
Linux环境下java程序获取oracle数据库连接超时的问题解决
2017-02-23 14:29 4536Linux下运行java程序(jdk ... -
一个Java swing桌面应用程序的JVM内存调优
2017-02-22 15:58 1131背景介绍 用java swing(jdk ... -
Tomcat 7源码学习笔记 -11 日志输出
2012-12-25 20:33 3732一.关于tomcat的日志设计 ... -
Tomcat 7源码学习笔记 -10 配置多个虚拟host
2012-12-25 16:22 1414一般情况下,安装完的Tomcat环境都有一个name为loca ... -
Tomcat 7源码学习笔记 -9 tomcat重启后session仍然保留
2012-12-03 13:07 4602使用Tomcat 7缺省的配置,tomcat关闭后重新启动,发 ... -
Tomcat 7源码学习笔记 -8 Filter过滤器解读
2012-11-29 16:15 69591.过滤器的主要功能是允许我们在request转给某个资源之前 ... -
synchronized关键字实现信号量同步功能
2012-11-22 09:55 1806下面的代码,不加mys.acquire();和mys.rele ... -
Tomcat 7源码学习笔记 -7 请求转发forward和重定向redirect
2012-11-16 10:21 4271在servlet里面接收到一个请求以后,处理完毕,根据需 ... -
Tomcat 7源码学习笔记 -6 encodeURL深度解析补充
2012-11-15 13:54 3109之前提到调用response.encodeURL(String ... -
Tomcat 7源码学习笔记 -6 encodeURL深度解析
2012-11-14 15:03 1710在servlet中,当客户端禁用了cookie的情况下,为了保 ... -
Tomcat 7源码学习笔记 -5 web app自动reload
2012-11-06 17:42 6937一个运行中的web app,如果修改了其中的一部分代码,然后更 ... -
Tomcat 7源码学习笔记 -4 encoding的处理机制
2012-11-02 15:15 2822一.概述 Tomcat对http请求的字符编码支持得有些混乱 ... -
Tomcat 7源码学习笔记 -3 Http11Protocol和Http11NioProtocol
2012-10-30 23:12 9148Tomcat既支持阻塞式IO,也支持非阻塞式IO。 如果要使 ... -
Tomcat 7源码学习笔记 - 1 (socket多线程)
2012-10-28 22:58 3012tomcat说白了就是一个socket服务线程,监听8080端 ...
相关推荐
《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...
《深入解析Tomcat-Redis-Session-Manager源码》 在现代Web应用中,服务器端会话管理是一个至关重要的部分,特别是在高并发、分布式环境中。Tomcat作为最流行的Java Servlet容器,提供了丰富的功能来支持这一需求。...
开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-...
Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)
【Tomcat 源代码调试笔记 - 看不见的 Shell】这篇笔记主要探讨了如何在Tomcat运行时动态插入过滤器,以及遇到的问题和解决方法。Tomcat作为一个流行的Java应用服务器,它允许开发者通过Servlet规范中的`...
apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-...
因tomcat7使用redis共享session,其他的包存在问题,自己编译后处理通过。 该包是在https://github.com/jcoleman/tomcat-redis-session-manager 将源码编译后的包。
《深入理解Tomcat连接器:剖析tomcat-connectors-1.2.48-src源码》 Tomcat作为一款广泛使用的开源Java应用服务器,其在处理Web应用方面扮演着核心角色。而Tomcat的连接器(Connector)是其与外部世界交互的关键组件...
标题 "tomcat-redis-session-manager-1.2-tomcat-6&7" 指的是一个用于在Tomcat服务器中集成Redis作为session管理器的组件。这个组件使得Web应用程序可以利用Redis分布式缓存系统来存储和管理用户的会话数据,从而...
描述中提到的“修改了tomcat-redis-session-manager源码进行的编译生成的jar包”,意味着这个jar包不是官方发布的原版,而是经过开发者对源代码进行了一些定制化的修改后重新编译得到的。这样的修改可能包括修复已知...
压缩文件包括tomcat-redis-session-manager-master-2.0.0.jar、jedis-2.7.3.jar、commons-pool2-2.3.jar三个jar包使用方法请参照https://github.com/jcoleman/tomcat-redis-session-manager。apache-tomcat-8.5.33....
用于配置 tomcat-redis-session-manager
解压“tomcat-connectors-1.2.32-src”后,我们可以看到源码目录结构,包括头文件、C源文件、配置脚本等。主要的核心文件有: 1. modules/jk/*.c:这是JK模块的源代码,负责处理与Tomcat的连接和通信。 2. modules/...
tomcat-redis-session-manager-2.0.0.jar包,不用自己打包了,tomcat共享session到redis中,解决分布式应用的状态问题。
这个"apache-tomcat-8.5.32-windows-x64.zip"压缩包是针对Windows 64位系统的Tomcat 8.5.32版本的安装包。这个版本在Tomcat 8系列中是一个稳定版本,它提供了许多特性,优化了性能,并修复了一些已知的安全问题。 ...
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
解压这个"apache-tomcat-8.0.47"文件后,您会发现以下目录结构: - **bin**:包含启动和停止Tomcat的脚本以及一些实用工具。 - **conf**:存放Tomcat的配置文件,如server.xml、web.xml等。 - **lib**:存储Tomcat...
解压后的"apache-tomcat-10.0.0-M4"目录结构通常包括以下关键部分: 1. **bin**:包含启动和停止Tomcat的脚本,如`catalina.bat`和`startup.bat`,以及其他管理工具。 2. **conf**:存放服务器配置文件,如`server....
`apache-tomcat-8.5.47-src.zip`这个压缩包包含了Tomcat 8.5.47版本的完整源代码,这对于想要研究Tomcat工作原理、优化性能或者进行自定义扩展的开发者非常有价值。 在开始学习Tomcat源码之前,首先需要了解一些...
总之,"tomcat-native-1.2.14-win32-64-bin"是一个用于解决Tomcat兼容性问题和提升性能的库,特别是对于处理SSL/TLS连接。正确集成和使用这个库可以显著改善Tomcat在Windows环境下的运行效率。对于需要处理大量SSL...