看不明白此圖沒關係,後面慢慢提到此圖的類:
app
它實現Filter、繼承ServletContextSupport。
它主要實現了init(FilterConfig filterConfig)
方法,此方法主要設置了本類的FilterConfig filterConfig
和ServletContextSupport
的ServletContext servletContext
。post
此類主要提供設置參數、獲取ServletContext、操做Attribute等方法。
3d
此類主要用於給Fitler命名,若是沒有設置命名,則用FilterName。code
此類有一個屬性boolean enabled = true
,還暴露了方法訪問、操做此屬性,此屬性用於控制此Filter是否生效:
orm
咱們看doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
方法。
此方法的alreadyFilteredAttributeName
變量根據Filter名稱組成,可惟一標識一個Filter,可見getAlreadyFilteredAttributeName
方法。
經過Attribute標識此請求是否已執行,經過request.getAttribute
方法判斷是否存在該屬性,最後在處理完過濾器後,finally塊經過request.removeAttribute
方法刪除該屬性。
向後暴露doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain)
抽象方法。blog
此類的入口爲doFilterInternal
方法。繼承
在doFilterInternal
方法,能夠看到prepareServletRequest
和prepareServletResponse
方法,一路跟蹤進去可見ShiroHttpServletRequest,它繼承HttpServletRequestWrapper,這是典型的裝飾器模式。資源
此類只有一個方法,就是init
方法。
此方法的調用關係以下:
rem
看此類,會發現與AOP切面的風格很類似,至關於執行過濾器鏈的切面。主要邏輯體如今doFilterInternal
方法中。get
preHandle
,前置處理,若是返回true,說明執行過濾器鏈,不然不執行,中斷執行鏈。今後變量命名就可知:boolean continueChain = preHandle(request, response);
postHandle
,後置處理。執行過濾器鏈後,會執行此方法afterCompletion
,完成時處理。在執行完過濾器後,不管正常返回或拋出異常,都會執行此方法,主要用於資源回收。(注:此方法的調用在cleanup
方法中)屬性pathMatcher
,是Ant風格的路徑匹配器:PatternMatcher pathMatcher = new AntPathMatcher()
,好比?表示一個字符,*表示0個或多個字符,**表示0個或多個目錄。
方法pathsMatch
,會獲取請求的URI,而後使用路徑匹配器去判斷是否匹配。
方法preHandle
是前置處理的方法,會先判斷appliedPaths是否有配置的路徑通配符,若是沒有,則經過;而後遍歷appliedPaths調用pathsMatch
匹配當前請求路徑。若是匹配,調用isFilterChainContinued
方法。
方法isFilterChainContinued
,若是此Filter有效的,則調onPreHandle
決定是否繼續Filter鏈;如此Filter無效,返回true,繼續Filter鏈。
方法onPreHandle
,默認返回true,即繼續Filter鏈。
方法onPreHandle
,調用isAccessAllowed
方法和onAccessDenied
方法肯定是否繼續執行。返回true則繼續執行filter鏈,返回false則不執行。
方法isAccessAllowed
,是否容許訪問
方法onAccessDenied
,當被方法isAccessAllowed
拒絕訪問時,調用此方法,此方法爲處理措施,處理完畢,返回true則繼續執行filter鏈,返回false則不執行。處理措施,好比嘗試登錄。
方法isAccessAllowed
,判斷是否已認證
跳轉到成功頁面或攔截前想前往的頁面
方法isAccessAllowed
,用AuthenticationFilter的認證判斷,若是未認證,判斷此請求是否登陸請求、容許的請求
方法isAccessAllowed
,首先判斷請求URL的請求方法是否須要認證,而後再調用父類的isAccessAllowed
判斷是否定證
方法onAccessDenied
,首先判斷是否登陸請求,若是爲否,則保存請求並跳到登陸頁。若有爲是,則判斷是否POST HTTP請求,若是是則執行登陸