Shiro 基本過濾器

Shiro攔截器的基礎(chǔ)類圖:

1、NameableFilter:NameableFilter給Filter起個(gè)名字,如果沒有設(shè)置默認(rèn)就是FilterName;還記得之前的如authc嗎?當(dāng)我們組裝攔截器鏈時(shí)會根據(jù)這個(gè)名字找到相應(yīng)的攔截器實(shí)例;

2、OncePerRequestFilter:OncePerRequestFilter用于防止多次執(zhí)行Filter的;也就是說一次請求只會走一次攔截器鏈;另外提供enabled屬性,表示是否開啟該攔截器實(shí)例,默認(rèn)enabled=true表示開啟,如果不想讓某個(gè)攔截器工作,可以設(shè)置為false即可。

3、ShiroFilter:ShiroFilter是整個(gè)Shiro的入口點(diǎn),用于攔截需要安全控制的請求進(jìn)行處理,這個(gè)之前已經(jīng)用過了。

4、AdviceFilter:AdviceFilter提供了AOP風(fēng)格的支持,類似于SpringMVC 中的Interceptor。

preHandler:類似于AOP 中的前置增強(qiáng);在攔截器鏈執(zhí)行之前執(zhí)行;如果返回true 則繼續(xù)攔截器鏈;否則中斷后續(xù)的攔截器鏈的執(zhí)行直接返回;進(jìn)行預(yù)處理(如基于表單的身份驗(yàn)證、授權(quán))

postHandle:類似于AOP 中的后置返回增強(qiáng);在攔截器鏈執(zhí)行完成后執(zhí)行;進(jìn)行后處理(如記錄執(zhí)行時(shí)間之類的);

afterCompletion:類似于AOP 中的后置最終增強(qiáng);即不管有沒有異常都會執(zhí)行;可以進(jìn)行清理資源(如接觸Subject與線程的綁定之類的);

5、PathMatchingFilter

PathMatchingFilter 提供了基于Ant 風(fēng)格的請求路徑匹配功能及攔截器參數(shù)解析的功能,如“roles[admin,user]”自動(dòng)根據(jù)“,”分割解析到一個(gè)路徑參數(shù)配置并綁定到相應(yīng)的路徑:

pathsMatch:該方法用于path 與請求路徑進(jìn)行匹配的方法;如果匹配返回true;

onPreHandle:在preHandle 中,當(dāng)pathsMatch 匹配一個(gè)路徑后,會調(diào)用opPreHandler 方法并將路徑綁定參數(shù)配置傳給mappedValue;然后可以在這個(gè)方法中進(jìn)行一些驗(yàn)證(如角色授權(quán)),如果驗(yàn)證失敗可以返回false 中斷流程;默認(rèn)返回true;也就是說子類可以只實(shí)現(xiàn)onPreHandle即可,無須實(shí)現(xiàn)preHandle。如果沒有path 與請求路徑匹配,默認(rèn)是通過的(即preHandle 返回true)。

6、AccessControlFilter

AccessControlFilter提供了訪問控制的基礎(chǔ)功能;比如是否允許訪問/當(dāng)訪問拒絕時(shí)如何處理等:

isAccessAllowed:表示是否允許訪問;mappedValue 就是[urls]配置中攔截器參數(shù)部分,如果允許訪問返回true,否則false;

onAccessDenied:表示當(dāng)訪問拒絕時(shí)是否已經(jīng)處理了;如果返回true 表示需要繼續(xù)處理;如果返回false表示該攔截器實(shí)例已經(jīng)處理了,將直接返回即可。

onPreHandle會自動(dòng)調(diào)用這兩個(gè)方法決定是否繼續(xù)處理:

另外AccessControlFilter還提供了如下方法用于處理如登錄成功后/重定向到上一個(gè)請求:

比如基于表單的身份驗(yàn)證就需要使用這些功能。

如果我們想進(jìn)行訪問訪問的控制就可以繼承

AccessControlFilter;如果我們要添加一些通用數(shù)據(jù)我們可以直接繼承PathMatchingFilter。