Apache Shiro源码原理解读1

先从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,这两个对象是很重要的对象。

初始化先分析到此,后续会再分享一些重要的对象。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章