【Shiro】小讀Shiro Filter

類繼承結構圖

看不明白此圖沒關係,後面慢慢提到此圖的類:
app

AbstractFilter,抽象過濾器

它實現Filter、繼承ServletContextSupport。
它主要實現了init(FilterConfig filterConfig)方法,此方法主要設置了本類的FilterConfig filterConfigServletContextSupportServletContext servletContextpost

ServletContextSupport,ServletContext的基礎支持類

此類主要提供設置參數、獲取ServletContext、操做Attribute等方法。
3d

NameableFilter,命名過濾器

此類主要用於給Fitler命名,若是沒有設置命名,則用FilterName。code

OncePerRequestFilter,單次請求過濾器

設置Filter是否生效

此類有一個屬性boolean enabled = true,還暴露了方法訪問、操做此屬性,此屬性用於控制此Filter是否生效:
orm

一個請求只執行一次此Filter

咱們看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

AbstractShiroFilter,抽象Shiro過濾器

此類的入口爲doFilterInternal方法。繼承

ShiroHttpServletRequest,Shiro的包裝請求類

doFilterInternal方法,能夠看到prepareServletRequestprepareServletResponse方法,一路跟蹤進去可見ShiroHttpServletRequest,它繼承HttpServletRequestWrapper,這是典型的裝飾器模式。資源

ShiroFilter,Shiro過濾器

此類只有一個方法,就是init方法。
此方法的調用關係以下:
rem

另外一個類繼承結構圖

AdviceFilter,相似切面的過濾器

看此類,會發現與AOP切面的風格很類似,至關於執行過濾器鏈的切面。主要邏輯體如今doFilterInternal方法中。get

  • preHandle,前置處理,若是返回true,說明執行過濾器鏈,不然不執行,中斷執行鏈。今後變量命名就可知:boolean continueChain = preHandle(request, response);
  • postHandle,後置處理。執行過濾器鏈後,會執行此方法
  • afterCompletion,完成時處理。在執行完過濾器後,不管正常返回或拋出異常,都會執行此方法,主要用於資源回收。(注:此方法的調用在cleanup方法中)

PathMatchingFilter

屬性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鏈。

AccessControlFilter,訪問控制過濾器

方法onPreHandle,調用isAccessAllowed方法和onAccessDenied方法肯定是否繼續執行。返回true則繼續執行filter鏈,返回false則不執行。
方法isAccessAllowed,是否容許訪問
方法onAccessDenied,當被方法isAccessAllowed拒絕訪問時,調用此方法,此方法爲處理措施,處理完畢,返回true則繼續執行filter鏈,返回false則不執行。處理措施,好比嘗試登錄。

AuthenticationFilter,認證過濾器

方法isAccessAllowed,判斷是否已認證
跳轉到成功頁面或攔截前想前往的頁面

AuthenticatingFilter,驗證過濾器

方法isAccessAllowed,用AuthenticationFilter的認證判斷,若是未認證,判斷此請求是否登陸請求、容許的請求

BasicHttpAuthenticationFilter,基礎認證過濾器

方法isAccessAllowed,首先判斷請求URL的請求方法是否須要認證,而後再調用父類的isAccessAllowed判斷是否定證

FormAuthenticationFilter,表單認證過濾器

方法onAccessDenied,首先判斷是否登陸請求,若是爲否,則保存請求並跳到登陸頁。若有爲是,則判斷是否POST HTTP請求,若是是則執行登陸

相關文章
相關標籤/搜索