1. 程式人生 > >shiro原始碼-執行shiro過濾器

shiro原始碼-執行shiro過濾器

接上篇,我們又來到了最關鍵的doFilterInternal方法中,這一次我們會走AdviceFilter中的doFilterInternal方法。這個方法裡面,主要有兩句程式碼,preHandle方法主要作用是判斷是否繼續執行過濾器的,當返回true時,繼續執行過濾器。executeChain方法就是真正執行過濾器了。

preHandle是經常被重寫的方法,因為我們認證的個性化配置就是在這個方法裡面實現的。在AdviceFilter類裡就有這個方法的實現,但是是直接return true,代表所有請求都往下執行,所以沒有看的必要,我們看一下它的子類PathMatchingFilter裡面的實現吧,如果你不重寫這個方法的話,一般都會走這個實現。這個方法裡面主要有一個isFilterChainContinued方法和一個appliedPaths屬性,但是這個屬性的值是怎麼來的,我還沒搞清楚,就暫且不討論了,isFilterChainContinued方法還是要看它的具體方法。

isFilterChainContinued方法裡面只有一句程式碼,就是onPreHandle方法的呼叫,這個方法重寫的地方很多,一般要認證的請求會走AccessControlFilter,不需要認證的請求會走AnonymousFilter,AnonymousFilter裡面的onPreHandle方法是直接return true,表示直接往下走,所以我們還是來看看AccessControlFilter中的實現吧。

AccessControlFilter中的onPreHandle方法中呼叫了兩個方法,isAccessAllowed和onAccessDenied,一般來講,isAccessAllowed方法是認證的方法,onAccessDenied方法是認證失敗之後的方法。

你完全可以重寫這裡的isAccessAllowed方法來實現你的個性化認證,shiro預設的實現是AuthenticationFilter中的實現,具體實現是直接取subject中的authenticated引數的值,authenticated為true則認證通過,false則不通過,而authenticated的值在subject建立時就被賦予了。

onAccessDenied預設實現是FormAuthenticationFilter中的實現,具體實現是直接跳到登入頁面了。這裡值得注意的是,一般前後端分離的專案認證失敗後,應該是直接返回認證失敗的狀態碼給前端,所以這個時候必須要重寫這個方法,如果不重寫的話,前端請求會出現302重定向的錯誤。

到這裡,preHandle方法就算完成呼叫了,回到上面,當continueChain為true時,表示驗證通過,然後執行後面的過濾器,最後到具體的請求地址的方法,返回結果,完成一次請求。當為false時,則表示驗證不通過,也就不會往下執行了,直接返回結果了。

另外,這個方法中的postHandle方法,沒有預設實現,這個方法表示所有的請求在完成請求,返回請求結果之前的一個操作,如果有需要,可以重寫這個方法。