1. 程式人生 > >shiro url和過濾器處理功能

shiro url和過濾器處理功能

1、PathMatchingFilter

PathMatchingFilter提供了基於Ant風格的請求路徑匹配功能及攔截器引數解析的功能,如“roles[admin,user]”自動根據“,”分割解析到一個路徑引數配置並繫結到相應的路徑:

Java程式碼  收藏程式碼
  1. boolean pathsMatch(String path, ServletRequest request)  
  2. 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提供了訪問控制的基礎功能;比如是否允許訪問/當訪問拒絕時如何處理等:

Java程式碼  收藏程式碼
  1. abstract boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;  
  2. boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;  
  3. abstract boolean onAccessDenied(ServletRequest request, ServletResponse response) throws
     Exception;   

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

onAccessDenied:表示當訪問拒絕時是否已經處理了;如果返回true表示需要繼續處理;如果返回false表示該攔截器例項已經處理了,將直接返回即可。

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

Java程式碼  收藏程式碼
  1. boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
  2.     return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);  
  3. }   

另外AccessControlFilter還提供瞭如下方法用於處理如登入成功後/重定向到上一個請求: 

Java程式碼  收藏程式碼
  1. void setLoginUrl(String loginUrl) //身份驗證時使用,預設/login.jsp  
  2. String getLoginUrl()  
  3. Subject getSubject(ServletRequest request, ServletResponse response) //獲取Subject例項  
  4. boolean isLoginRequest(ServletRequest request, ServletResponse response)//當前請求是否是登入請求  
  5. void saveRequestAndRedirectToLogin(ServletRequest request, ServletResponse response) throws IOException //將當前請求儲存起來並重定向到登入頁面  
  6. void saveRequest(ServletRequest request) //將請求儲存起來,如登入成功後再重定向回該請求  
  7. void redirectToLogin(ServletRequest request, ServletResponse response) //重定向到登入頁面   

比如基於表單的身份驗證就需要使用這些功能。

到此基本的攔截器就完事了,如果我們想進行訪問訪問的控制就可以繼承AccessControlFilter;如果我們要新增一些通用資料我們可以直接繼承PathMatchingFilter。