Jetty9源码剖析 - Handler组件 - ContextHandler
转载自ph0ly:http://www.pholy.com
一、ContextHandler的概念
ContextHandler主要是完成上下文路径及Servlet路径的处理,是Jetty中必不可少的处理器
二、应用场景
对请求的Url提取出相应的上下文路径及Servlet需要的路径,便于后续的处理器或业务层使用
三、继承体系
可以看到ContextHandler是一个ScopedHandler,具有ScopedHandler相关的特性(前面的文章已经提到过这些特性,如果不清楚的可以回去翻下之前的文章)
四、源码剖析
doStart:
设置类加载,放到当前线程上下文类加载器中
获取旧ServletContext便于后续恢复
通知声明周期观察者,进入启动周期
启动该ContextHandler
设置当前ContextHandler状态可用
完成后通知退出启动,并恢复到以前的状态(例如ServletContext、ClassLoader)
doScope:
获取前置的ServletContext、请求类型DispatcherType
校验请求路径是否合法,并根据请求的Url提取出pathInfo
同样设置类加载器,和前面思路一致,这里就不再赘述
设置ContextPath,设置pathInfo(url = contextPath + servletPath + pathInfo)
通知观察者开始进入doScope的生命周期
调用下一个链执行doScope
完成后恢复之前的状态,思路和其他的Handler基本一致,这里就不再赘述
doHandle:
通知生命周期观察者ContextHandler已经初始化完毕
如果是直接请求,判断是否访问了受保护的路径
执行下一个链的处理
处理完成后通知生命周期观察者,该Context已经被销毁
五、总结
ContextHandler作为一个对ServletContext预处理的处理器,核心就是对路径资源校验,同时将路径相关的值初始化完成,比较简单,这里就不再多说了。下一节我们着重来看ServletHandler,这个是整个Servlet容器最关键的地方~