shiro AccessControlFilter運作步驟
- 介紹
- 執行流程
- 總結
-
- 其他相關連結
介紹
任何篩選器的超類,用于控制對資源的通路,并可能将使用者重定向到登入頁面 如果它們未經身份驗證。
此超類提供方法saveRequestAndRedirectToLogin(javax.servlet.ServletRequest,javax.servlet.ServletResponse),許多子類将其用作使用者未經身份驗證時的行為
AccessControlFilter提供了通路控制的基礎功能;比如是否允許通路/當通路拒絕時如何處理等:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnL2QGNmZWM3EGZ4QDNmZGO4MjYzQDMlFDN4UmM1YDOmJ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
isAccessAllowed:表示是否允許通路;mappedValue就是[urls]配置中攔截器參數部分,如果允許通路傳回true,否則false;
onAccessDenied:表示當通路拒絕時是否已經處理了;如果傳回true表示需要繼續處理;如果傳回false表示該攔截器執行個體已經處理了,将直接傳回即可。
onPreHandle會自動調用這兩個方法決定是否繼續處理:
可以發現他是調用的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