天天看點

shiro AccessControlFilter運作步驟介紹執行流程總結

shiro AccessControlFilter運作步驟

  • 介紹
  • 執行流程
  • 總結
    • 其他相關連結

介紹

任何篩選器的超類,用于控制對資源的通路,并可能将使用者重定向到登入頁面 如果它們未經身份驗證。
此超類提供方法saveRequestAndRedirectToLogin(javax.servlet.ServletRequest,javax.servlet.ServletResponse),許多子類将其用作使用者未經身份驗證時的行為
           

AccessControlFilter提供了通路控制的基礎功能;比如是否允許通路/當通路拒絕時如何處理等:

shiro AccessControlFilter運作步驟介紹執行流程總結

isAccessAllowed:表示是否允許通路;mappedValue就是[urls]配置中攔截器參數部分,如果允許通路傳回true,否則false;

onAccessDenied:表示當通路拒絕時是否已經處理了;如果傳回true表示需要繼續處理;如果傳回false表示該攔截器執行個體已經處理了,将直接傳回即可。

onPreHandle會自動調用這兩個方法決定是否繼續處理:

shiro AccessControlFilter運作步驟介紹執行流程總結

可以發現他是調用的isAccessAllowed方法和onAccessDenied方法,隻要兩者有一個可以就可以了,從名字中我們也可以了解,他的邏輯是這樣:先調用isAccessAllowed,如果傳回的是true,則直接放行執行後面的filter和servlet,如果傳回的是false,則繼續執行後面的onAccessDenied方法,如果後面傳回的是true則也可以有權限繼續執行後面的filter和servelt。

隻有兩個函數都傳回false才會阻止後面的filter和servlet的執行。

執行流程

當我們繼承AccessControlFilter 類,isAccessAllowed方法在這個類中都是抽象的,依靠實作類實作。onAccessDenied方法不是抽象的,但是調用了另一個抽象的方法:

org.apache.shiro.web.filter.AccessControlFilter.onAccessDenied(ServletRequest, ServletResponse)

這個方法忽略了之前配置的param參數。

當請求進來之後,率先onPreHandle()方法,前置方法裡面 我們可以進行日志操作 驗證碼 等等,然後調用實作類的isAccessAllowed() 方法,如果傳回false,則會接着調用onAccessDenied()。

總結

shiro 提供的方法,可以利用其特性 進行類似 驗證碼校驗,前置校驗等等

路漫漫其修遠兮,吾将上下而求索

希望可以幫助到你

其他相關連結

shiro提供的filter-AccessControlFilter

【shiro】AccessControlFilter