先从web application的配置文件说起,请先读这里,Apache Shiro Web Support,
我们看到需要配置EnvironmentLoaderListener和ShiroFilter,我们一步一步来看看这里面做了什么。
先来几张图,让大家有个整体的概念,如下,图1,
再看EnvironmentLoaderListener,做了些什么,如下图,
determineWebEnvironmentClass会返回IniWebEnvironment,LifecycleUtils.init()方法会最终调用IniWebEnvironment.init()方法进行WebEnvironment的初始化。
接着我们看下图2
我们来看看IniWebEnvironment做了什么,
getIni()方法会读取默认或指定的配置文件,进行文件预处理成Ini对象,就是key-value对,value是Section对象,继承于Map,也是k-v对。
最最重要的两个操作就是,createWebSecurityManager和createFilterChainResolver,并设置到IniWebEnvironment中。
如下,图3,大部分逻辑集中在AbstractShiroFilter中,这个类中有两个重要的方法,
doFilterInternal()保证是OncePerRequest,是每个request进来会执行的方法,看api说明,最终最重要的执行方法是executeChain()方法
如上图所示,通过FilterChainManager查找FilterChain,通过pathMatches()方法进行路径匹配(最终调用的是AntPathMatcher类),如果配置到,就执行doFilter()方法并返回,注意这个return,说明ini配置文件中[urls]规则内容是从上到下,依次匹配的,这是个短路操作,所以,在配置[urls]规则时,推荐规格由上到下,由严到宽,这样的配置方式,当然,也可以在这里修改配置规则,进行and匹配。
通过以上分析,我们至少可以明白,SevletContext域中保存了WebEnvironment,而WebEnvironment中保存了securityManager和FilterChainManager,这两个对象是很重要的对象。
初始化先分析到此,后续会再分享一些重要的对象。