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,這兩個對象是很重要的對象。

初始化先分析到此,後續會再分享一些重要的對象。


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