shiro url和過濾器處理功能
1、PathMatchingFilter
PathMatchingFilter提供了基於Ant風格的請求路徑匹配功能及攔截器引數解析的功能,如“roles[admin,user]”自動根據“,”分割解析到一個路徑引數配置並繫結到相應的路徑:
Java程式碼- boolean pathsMatch(String path, ServletRequest request)
- boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception
pathsMatch:該方法用於path與請求路徑進行匹配的方法;如果匹配返回true;
onPreHandle:在preHandle中,當pathsMatch匹配一個路徑後,會呼叫opPreHandler方法並將路徑繫結引數配置傳給mappedValue;然後可以在這個方法中進行一些驗證(如角色授權),如果驗證失敗可以返回false中斷流程;預設返回true;也就是說子類可以只實現onPreHandle即可,無須實現preHandle。如果沒有path與請求路徑匹配,預設是通過的(即preHandle返回true)。
2、AccessControlFilter
AccessControlFilter提供了訪問控制的基礎功能;比如是否允許訪問/當訪問拒絕時如何處理等:
- abstract boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;
- boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;
- abstract boolean onAccessDenied(ServletRequest request, ServletResponse response) throws
isAccessAllowed:表示是否允許訪問;mappedValue就是[urls]配置中攔截器引數部分,如果允許訪問返回true,否則false;
onAccessDenied:表示當訪問拒絕時是否已經處理了;如果返回true表示需要繼續處理;如果返回false表示該攔截器例項已經處理了,將直接返回即可。
onPreHandle會自動呼叫這兩個方法決定是否繼續處理:
Java程式碼- boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
- return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
- }
另外AccessControlFilter還提供瞭如下方法用於處理如登入成功後/重定向到上一個請求:
Java程式碼- void setLoginUrl(String loginUrl) //身份驗證時使用,預設/login.jsp
- String getLoginUrl()
- Subject getSubject(ServletRequest request, ServletResponse response) //獲取Subject例項
- boolean isLoginRequest(ServletRequest request, ServletResponse response)//當前請求是否是登入請求
- void saveRequestAndRedirectToLogin(ServletRequest request, ServletResponse response) throws IOException //將當前請求儲存起來並重定向到登入頁面
- void saveRequest(ServletRequest request) //將請求儲存起來,如登入成功後再重定向回該請求
- void redirectToLogin(ServletRequest request, ServletResponse response) //重定向到登入頁面
比如基於表單的身份驗證就需要使用這些功能。
到此基本的攔截器就完事了,如果我們想進行訪問訪問的控制就可以繼承AccessControlFilter;如果我們要新增一些通用資料我們可以直接繼承PathMatchingFilter。