【Shiro】小讀Shiro Filter


類繼承結構圖

看不明白此圖不要緊,后面慢慢提到此圖的類:

AbstractFilter,抽象過濾器

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

ServletContextSupport,ServletContext的基礎支持類

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

NameableFilter,命名過濾器

此類主要用於給Fitler命名,如果沒有設置命名,則用FilterName。

OncePerRequestFilter,單次請求過濾器

設置Filter是否生效

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

一個請求只執行一次此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)抽象方法。

AbstractShiroFilter,抽象Shiro過濾器

此類的入口為doFilterInternal方法。

ShiroHttpServletRequest,Shiro的包裝請求類

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

ShiroFilter,Shiro過濾器

此類只有一個方法,就是init方法。
此方法的調用關系如下:

另一個類繼承結構圖

AdviceFilter,類似切面的過濾器

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

  • 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請求,如果是則執行登錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM