设为首页 收藏本站
查看: 566|回复: 0

[经验分享] [解读Tomcat6源码]Tomcat处理底层socket请求的过程

[复制链接]

尚未签到

发表于 2017-2-6 12:01:50 | 显示全部楼层 |阅读模式
任务
找到如何截获httpsocket请求,然后才能干预tomcat处理http请求。
编译jsp文件的跟踪:

网站访问日志阀AccessLogValve
可以看到两个过程的公共之处。那就是前四个

 
是跟Socket有关的,属于底层协议处理。在第4个调用再往后就是跟requestresponse打交道了。
       因此,我需要研究前4个函数的作用。下面就逐一进行。
(一)  首先是thread.run肯定就是我们的jre运行java程序的共用部分,所以无需细致研究。
(二)  然后就是JIoEndpointWorkerrun方法.
让我们耐心一点,看一看JIoEndpoint的结构吧。
首先这个jioEndpoint文件其中包含:1个内部接口和3个内部类,剩下的就是本身的属性和方法。其中的serverSocket成员让我们想到了《网络编程详解》中的讲解。
可以看出1个内部接口和3个内部类都是为了声明内部成员变量的类型而进行定义的。

接着切入正题吧,看来是Thread中的
    public void run() {
       if (target != null) {
           target.run();
       }
}
调用了jioEndpoint.java中的worker类型对象的run()方法。
        public void run() {
 
            //直到收到关闭信号,否则一直处理请求
            while (running) {
 
                // 等到指派来的下一个socket对象
                Socket socket = await();
//await函数是worker的内部方法,作用是Await a newly assigned Socket from our Connector
                if (socket == null)
                    continue;
 
                // 处理这个socket发出的请求,
//setSocketOptionJIoEndpoint的方法,作用是为这个socket设置一些timeout, linger
//handler.process其中handlerJIoEndpoint的一个成员变量,实际上就是结果socket处理的接力棒,通过它来处理这个socket对象
                if (!setSocketOptions(socket) || !handler.process(socket)) {红色部分就是下一部分要讨论的内容
                    // Close socket
                    try {
                        socket.close();
                    } catch (IOException e) {
                    }
                }
 
                // Finish up this request
                socket = null;
                recycleWorkerThread(this);
 
            }
 
        }
(三)  这个handler好像在初始化的时候被设置成了Http11ConnectionHandler,这样我们就到达了Http11Protocol文件的Http11ConnectionHandler内部类的public boolean process(Socket socket)方法,这个方法实现是这样的:
public boolean process(Socket socket) {

            Http11Processor processor = null;

            try {

                processor = localProcessor.get();

                if (processor == null) {

                    processor =

                        new Http11Processor(protocol.maxHttpHeaderSize, protocol.endpoint);

                    processor.setAdapter(protocol.adapter);

                    …

                    processor.setServer(protocol.server);

                    localProcessor.set(processor);

                    if (protocol.getDomain() != null) {

                        synchronized (this) {

                            try {

                                RequestInfo rp = processor.getRequest().getRequestProcessor();

                                rp.setGlobalProcessor(global);

                                ObjectName rpName = new ObjectName

                                (protocol.getDomain() + ":type=RequestProcessor,worker="

                                        + protocol.getName() + ",name=HttpRequest" + count++);

                                Registry.getRegistry(null, null).registerComponent(rp, rpName, null);

                            } catch (Exception e) {

                                log.warn("Error registering request");

                            }

                        }

                    }

                }

 

                if (processor instanceof ActionHook) {

                    ((ActionHook) processor).action(ActionCode.ACTION_START, null);

                }

 

                if (protocol.secure && (protocol.sslImplementation != null)) {

                    processor.setSSLSupport

                        (protocol.sslImplementation.getSSLSupport(socket));

                } else {

                    processor.setSSLSupport(null);

                }

               

                processor.process(socket);

                return false;

 

            } catch(java.net.SocketException e) {

                // SocketExceptions are normal

                Http11Protocol.log.debug


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-338359-1-1.html 上篇帖子: Tomcat中连接池的配置和使用 下篇帖子: 使用Cache-Control和gzip提升tomcat应用性能(整理)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表