浅读tomcat架构设计之Pipeline-Valve管道(4)
tomcat Container容器处理请求是使用Pipeline-Valve管道来处理的,后续写的tomcat内存马,和他紧密结合
Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程有多个处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完成后将处理后的请求返回,再让下一个处理者继续处理. 简单点来说就是Pipeline就是请求,发起各种请求, Valve用于处理过来的所有请求,你的请求都会走Valve,进行处理检查.
(1)每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,Valve的接口实现类是ValveBase
(2)在上层容器的管道的ValveBase会调用下层容器的管道
ValveBase的子类,有很多,分别有这些:

我着重讲下这四个子类
其中要讲的是这四个类,他们和Context,Engine,Host和Wrapper的请求处理息息相关.
Pipeline-Valve的实现方法:
Pipeline的接口实现类是org.apache.catalina.core.StandardPipeline:
StandardPipeline继承自LifecycleBase,所以StandardPipeline是生命周期类
查看startInternal方法:
  protected synchronized void startInternal() throws LifecycleException {
        Valve current = this.first;
        if (current == null) {
            current = this.basic;
        }
        for(; current != null; current = current.getNext()) {
            if (current instanceof Lifecycle) {
                ((Lifecycle)current).start();
            }
        }
        this.setState(LifecycleState.STARTING);
    }
学过数据结构的话,会感到很熟悉,我博客文章之前写过类似的代码,他是个链式结构,遍历所有的Valve并调用start方法,最后设置状态.
stopInternal和destroyInternal方法如下:
  protected synchronized void stopInternal() throws LifecycleException {
        this.setState(LifecycleState.STOPPING);
        Valve current = this.first;
        if (current == null) {
            current = this.basic;
        }
        for(; current != null; current = current.getNext()) {
            if (current instanceof Lifecycle) {
                ((Lifecycle)current).stop();
            }
        }
    }
    protected void destroyInternal() {
        Valve[] valves = this.getValves();
        Valve[] arr$ = valves;
        int len$ = valves.length;
        for(int i$ = 0; i$ < len$; ++i$) {
            Valve valve = arr$[i$];
            this.removeValve(valve);
        }
    }
代码和startInternal相似,都是使用current临时变量遍历Valve的所有Valve,destoryInternal是删除所有的valve
Pipeline管道处理请求的实现方法:
Engine,先从ValveBase的子类StandEngineValve类开始org.apache.catalina.core.StandardEngineValve
Pipeline管道调用所包含Valve的invoke来处理请求,invoke方法来处理请求
invoke方法:
  public final void invoke(Request request, Response response) throws IOException, ServletException {
        Host host = request.getHost();
        if (host == null) {
            response.sendError(400, sm.getString("standardEngine.noHost", new Object[]{request.getServerName()}));
        } else {
            if (request.isAsyncSupported()) {
                request.setAsyncSupported(host.getPipeline().isAsyncSupported());
            }
            host.getPipeline().getFirst().invoke(request, response);
        }
    }

首先通过reuquest获取Host站点,然后调用管道的第一个Valve的invoke方法进行处理
  Host,org.apache.catalina.core.StandardHostValve#invoke方法:    
代码太长,截取部分,Host的ValveBase调用的是Context的Pipeline
Context,org.apache.catalina.core.StandardContextValve#invoke方法:
    
代码太长,截取部分,Context的ValveBase调用的是Wrapper的Pipeline
Wrapper,org.apache.catalina.core.StandardWrapperValve#invoke方法:
    
      
代码太长,截取部分,Wrapper是封装Servlet的,ValveBase内部调用的是filterChain来处理请求的
Filter和Servlet的实际处理请求的方法在Wrapper的管道Pipeline->Valve-ValveBase-StandardWrapperValve#invoke方法中调用,Wrapper生命周期是在org.apache.catalina.core.StandardWrapper中调用,因为StandardWrapper继承自ContainerBase,ContainerBase又继承自LifecycleMBeanBase
浅读tomcat架构设计之Pipeline-Valve管道(4)的更多相关文章
- 浅读tomcat架构设计之tomcat容器Container(3)
		
浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html 浅读tomcat架构设计之tom ...
 - 浅读tomcat架构设计之tomcat生命周期(2)
		
浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html tomcat通过org.apac ...
 - 浅读tomcat架构设计和tomcat启动过程(1)
		
一图甚千言,这张图真的是耽搁我太多时间了: 下面的tomcat架构设计代码分析,和这张图息息相关. 使用maven搭建本次的环境,贴出pom.xml完整内容: <?xml version=&qu ...
 - Tomcat详解系列(2) - 理解Tomcat架构设计
		
Tomcat - 理解Tomcat架构设计 前文我们已经介绍了一个简单的Servlet容器是如何设计出来,我们就可以开始正式学习Tomcat了,在学习开始,我们有必要站在高点去看看Tomcat的架构设 ...
 - Tomcat 架构原理解析到架构设计借鉴
		
Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...
 - tomcat架构分析(valve源码导读)
		
出处:http://gearever.iteye.com 源码面前,了无秘密 ----侯捷 在tomcat架构分析(valve机制)(http ...
 - 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招
		
朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...
 - iOS开发之浅谈MVVM的架构设计与团队协作
		
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
 - 浅谈iOS中MVVM的架构设计与团队协作
		
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
 
随机推荐
- useradd linux系统创建用户和设置密码简单脚本-1
			
useradd linux系统创建用户和设置密码简单脚本-1 linux_wangqiang 2019-12-04 20:51:18 65 收藏展开#!/bin/bash#快速创建用户 使用$1第一个 ...
 - 攻防世界(五)Web_php_include
			
攻防世界系列:Web_php_include 方法一:大小写绕过 strstr()函数对php我协议进行了过滤,但我们可以尝试大小写绕过 抓包POST传值让其执行我们输入的命令 ?page=Php:/ ...
 - STM32的引脚的配置
			
http://blog.csdn.net/u010592722/article/details/45746079
 - devgridContral
			
#region 加载gridControl布局项 /// <summary> /// 加载gridControl布局项 /// </summ ...
 - 【pytest】使用parametrize将参数化变量传递到fixture
			
分享一个关于在pytest中,如何将测试用例文件中的变量传递到fixture函数. 一.交代应用场景 目前组内的项目,在根目录下是有一个conftest.py文件的,这里有个生成api token的f ...
 - MegEngine 框架设计
			
MegEngine 框架设计 MegEngine 技术负责人许欣然将带了解一个深度学习框架是如何把网络的定义逐步优化并最终执行的,从框架开发者的视角来看待深度学习. 背景 AI 浪潮一波又一波,仿佛不 ...
 - 主成分分析法(PCA)原理和步骤
			
主成分分析法(PCA)原理和步骤 主成分分析(Principal Component Analysis,PCA)是一种多变量统计方法,它是最常用的降维方法之一,通过正交变换将一组可能存在相关性的变量数 ...
 - 3D点云深度学*
			
3D点云深度学* 在自动驾驶中关于三维点云的深度学*方法应用.三维场景语义理解的方法以及对应的关键技术介绍. 1. 数据 但是对于3D点云,数据正在迅速增长.大有从2D向3D发展的趋势,比如在open ...
 - Linux架构思维导图
			
Linux架构思维导图 GUI(Graphical User Interface,图形用户界面) Linux学习路径 软件框架 Linux桌面介绍 FHS:文件系统目录标准 Linux需要特别注意的目 ...
 - 如何在CPU上优化GEMM(下)
			
如何在CPU上优化GEMM(下) Array Packing 另一个重要的技巧是数组打包.这个技巧是对数组的存储维度进行重新排序,将某个维度上的连续访问模式在平滑后转换为顺序模式. 如上图所示,在阻塞 ...