tomcat解析(十七)Http11Processor

Http11Processor类的构造方法会做一些初始化的动作,但这些内容不在本文讲解范围内,因此这里先不细讲,有兴趣的同志可自已了解一下哈
  

    我们主要还是看process方法,
1.一开始会先初始化一些I/O流
       
2.解析请求头部
   

3.调用处理类对请求进行处理,这里当然指的是具体的处理servlet啦
 

 这里需要看一下adapter是哪里来的,该类有setAdapter方法,调用的地方为Http11ConnectionHandler(该类为Http11Protocol的内部类)的createProcessor方法,参数为Http11Protocol的adapter变量,该变量是通过调用Http11Protocol的setAdapter方法设置进来的,其调用的地方为Connector.initialize,可看到以下语句:
 

  因此这里其实是将请求转发给CoyoteAdapter进行处理了,再看该类的service方法(是不是跟servlet很像啊:)),但该方法参数并非HttpServletRequest的实例,而是org.apache.coyote.Request实例,在该方法的前半部分,工作便是初始化servlet处理时需要用到的HttpServletRequest及HttpServletResponse实例,当然内容是从参数req而来,具体内容这里不细讲哈.
i.在初始化完HttpServletRequest及HttpServletResponse实例后,将调用postParseRequest做一些请求设置及请求匹配等处理
<1>内容有包括parseSessionId,查看请求中是否有"jsessionid="字段,有则调用request.setRequestedSessionId进行设置;
<2>匹配请求路径,获取用于处理的具体Host,Context,Servlet及对应的方法,这部分的内容也较多,这里先不讲,假设其完成了对路径的匹配
  connector.getMapper().map(serverName, decodedURI,
                            request.getMappingData());
  request.setContext((Context) request.getMappingData().context);
  request.setWrapper((Wrapper) request.getMappingData().wrapper);
<3>若有redirect设置,调用response.sendRedirect(redirectPath);
<4>如果支持Cookie,则从cookie中获取sessionId
 parseSessionCookiesId(req, request);
至此postParseRequest调用结束;
ii.connector.getContainer().getPipeline().getFirst().invoke(request, response);
 这里需要了解connector.getContainer()得到的对象是什么?查看其setContainer方法的调用,可以StandardService的setContainer里看到,而StandardService的setContainer则是在初始化StandardEngine的时候便会调用该方法(具体可看Catalina.createStartDigester),因此这里将会获得一个StandardEngine实例,再继续调用其getPipeline().getFirst().invoke(request, response),我们可在其构造方法中看到最后调用的应该是StandardEngineValve的invoke方法,该方法如下:
  

    这里将会继续调用StandardHost的相应方法,我们依然可在其构造方法里找到相应的对象为StandardHostValve,再看其invoke方法如下:
    

    在调用StandardContext的getPipeline().getFirst()时与其它的调用有所不同,不再只是简单的调用构造方法里加入的basic vavle,如果当前的Context有设置访问权限(在web.xml里配置<login-config>),则会相应地在该Context的Pipeline对象里加入授权管理的处理类,具体可看ContextConfig.start-->ContextConfig.authenticatorConfig,在该方法中将与<login-config>的auth-method对应地产生相应的处理类,如AUTH-METHOD为FORM,则将产生的处理类为org.apache.catalina.authenticator.FormAuthenticator(具体可参考配置文件org/apache/catalina/startup/Authenticators.properties),在实例化处理类后将调用Context的addValve方法加入到其pipeline对象中,可看一下该方法如下(具体类名为StandardPipeline):
     

    主要内容有i.启动处理类;ii.将该处理类设置为basic处理类(StandardContext的basic处理类为StandardContextValve,可见StandardContext的构造方法)的前一个处理类,如果basic处理类前无处理类,则此处理类为first处理类,因此当有配置访问限制的,将先调用对应的权限控制类的invoke方法,我们以FormAuthenticator(invoke方法在其父类AuthenticatorBase中)为例来看一下是如何进行处理的,由于该部分内容较多,因此将放在下一篇文章独立来讲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值