Jetty9源码剖析 - Handler组件 - ContextHandler

转载自ph0ly:http://www.pholy.com

一、ContextHandler的概念

ContextHandler主要是完成上下文路径及Servlet路径的处理,是Jetty中必不可少的处理器

二、应用场景

对请求的Url提取出相应的上下文路径及Servlet需要的路径,便于后续的处理器或业务层使用

三、继承体系

ContextHandler组件继承体系

可以看到ContextHandler是一个ScopedHandler,具有ScopedHandler相关的特性(前面的文章已经提到过这些特性,如果不清楚的可以回去翻下之前的文章)

四、源码剖析

ContextHandler.doStart方法实现

doStart:

设置类加载,放到当前线程上下文类加载器中

获取旧ServletContext便于后续恢复

通知声明周期观察者,进入启动周期

启动该ContextHandler

设置当前ContextHandler状态可用

完成后通知退出启动,并恢复到以前的状态(例如ServletContext、ClassLoader)

ContextHandler.doScope方法实现

ContextHandler.doScope方法实现

doScope:

获取前置的ServletContext、请求类型DispatcherType

校验请求路径是否合法,并根据请求的Url提取出pathInfo

同样设置类加载器,和前面思路一致,这里就不再赘述

设置ContextPath,设置pathInfo(url = contextPath + servletPath + pathInfo)

通知观察者开始进入doScope的生命周期

调用下一个链执行doScope

完成后恢复之前的状态,思路和其他的Handler基本一致,这里就不再赘述

ContextHandler.doHandle方法实现

doHandle:

通知生命周期观察者ContextHandler已经初始化完毕

如果是直接请求,判断是否访问了受保护的路径

执行下一个链的处理

处理完成后通知生命周期观察者,该Context已经被销毁

五、总结

ContextHandler作为一个对ServletContext预处理的处理器,核心就是对路径资源校验,同时将路径相关的值初始化完成,比较简单,这里就不再多说了。下一节我们着重来看ServletHandler,这个是整个Servlet容器最关键的地方~